這個 Laravel 套件可讓您搜尋多個 Eloquent 模型。它支援排序、分頁、範圍查詢、急切載入關係以及單列或多列搜尋。
❤️ 我們很自豪透過開發 Laravel 套件並免費贈送來支持社區。如果該軟體包可以節省您的時間或您在專業上依賴它,請考慮贊助維護和開發並查看我們最新的高級軟體包:慣性表。追蹤問題和拉取請求需要時間,但我們很樂意提供協助!
如果您想了解更多有關此包的背景,請閱讀部落格文章。
您可以透過 Composer 安裝該軟體包:
composer require protonemedia/laravel-cross-eloquent-search
get
方法已重新命名為search
。addWhen
方法已被刪除,取而代之的是when
。updated_at
列。如果您不使用時間戳,它現在將預設使用主鍵。 startWithWildcard
方法已重新命名為beginWithWildcard
。getUpdatedAtColumn
方法評估。以前它被硬編碼為updated_at
。您仍然可以使用另一列進行排序。allowEmptySearchQuery
方法和EmptySearchQueryException
類別已被刪除,但您仍然可以獲得結果而無需搜尋。 透過新增一個或多個要搜尋的模型來開始搜尋查詢。使用模型的類別名稱和要搜尋的列呼叫add
方法。然後使用搜尋項目呼叫search
方法,您將獲得一個包含結果的IlluminateDatabaseEloquentCollection
實例。
預設情況下,結果會依照更新的列升序排序。在大多數情況下,此欄位是updated_at
。如果您自訂了模型的UPDATED_AT
常數,或覆寫了getUpdatedAtColumn
方法,則此套件將使用自訂列。如果您根本不使用時間戳,它將預設使用主鍵。當然,您也可以按其他列排序。
use ProtoneMedia LaravelCrossEloquentSearch Search ;
$ results = Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
如果您關心縮進,您可以選擇在外觀上使用new
方法:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' howto ' );
還有一個when
方法可以根據另一個條件應用某些子句:
Search :: new ()
-> when ( $ user -> isVerified (), fn( $ search ) => $ search -> add ( Post ::class, ' title ' ))
-> when ( $ user -> isAdmin (), fn( $ search ) => $ search -> add ( Video ::class, ' title ' ))
-> search ( ' howto ' );
預設情況下,我們將搜尋字詞拆分,每個關鍵字都會獲得一個通配符來進行部分匹配。實際上,這意味著搜尋字詞apple ios
將導致apple%
和ios%
。如果您也希望以通配符開頭,可以呼叫beginWithWildcard
方法。這將導致%apple%
和%ios%
。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> search ( ' os ' );
注意:在此套件的早期版本中,此方法稱為startWithWildcard()
。
如果您想要停用將通配符附加到術語的行為,您應該使用false
呼叫endWithWildcard
方法:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> beginWithWildcard ()
-> endWithWildcard ( false )
-> search ( ' os ' );
開箱即用地支援多詞搜尋。只需將您的短語用雙引號括起來即可。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> search ( ' "macos big sur" ' );
您可以透過呼叫dontParseTerm
方法來停用搜尋項目的解析,這會提供與使用雙引號相同的結果。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> dontParseTerm ()
-> search ( ' macos big sur ' );
如果要按另一列對結果進行排序,可以將該列作為第三個參數傳遞給add
方法。呼叫orderByDesc
方法對結果進行降序排序。
Search :: add ( Post ::class, ' title ' , ' published_at ' )
-> add ( Video ::class, ' title ' , ' released_at ' )
-> orderByDesc ()
-> search ( ' learn ' );
您可以呼叫orderByRelevance
方法依照搜尋字詞出現的次數對結果進行排序。想像一下這兩句話:
如果您搜尋Apple iPad ,第二句話會先出現,因為搜尋字詞有更多符合。
Search :: add ( Post ::class, ' title ' )
-> beginWithWildcard ()
-> orderByRelevance ()
-> search ( ' Apple iPad ' );
如果您正在搜尋(巢狀)關係,則不支援按相關性排序。
若要按模型類型對結果進行排序,您可以使用orderByModel
方法,並為其指定模型的首選順序:
Search :: new ()
-> add ( Comment ::class, [ ' body ' ])
-> add ( Post ::class, [ ' title ' ])
-> add ( Video ::class, [ ' title ' , ' description ' ])
-> orderByModel ([
Post ::class, Video ::class, Comment ::class,
])
-> search ( ' Artisan School ' );
我們強烈建議對您的結果進行分頁。在search
方法之前呼叫paginate
方法,您將獲得IlluminateContractsPaginationLengthAwarePaginator
的實例作為結果。 paginate
方法採用三個(可選)參數來自訂分頁器。這些參數與 Laravel 的資料庫分頁器相同。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> paginate ()
// or
-> paginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
您也可以使用簡單的分頁。這將傳回IlluminateContractsPaginationPaginator
的實例,它不知道長度:
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> simplePaginate ()
// or
-> simplePaginate ( $ perPage = 15 , $ pageName = ' page ' , $ page = 1 )
-> search ( ' build ' );
您也可以將 Eloquent 查詢建構器的實例傳遞給add
方法,而不是類別名稱。這允許您向每個模型添加約束。
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> search ( ' compile ' );
您可以透過傳遞列數組作為第二個參數來搜尋多個列。
Search :: add ( Post ::class, [ ' title ' , ' body ' ])
-> add ( Video ::class, [ ' title ' , ' subtitle ' ])
-> search ( ' eloquent ' );
您可以使用點符號搜尋(巢狀)關係:
Search :: add ( Post ::class, [ ' comments.body ' ])
-> add ( Video ::class, [ ' posts.user.biography ' ])
-> search ( ' solution ' );
您可以透過addFullText
方法來使用 MySQL 的全文搜尋。您可以搜尋單列或多列(使用全文索引),並且可以指定一組選項,例如指定模式。您甚至可以在一個查詢中混合常規搜尋和全文搜尋:
Search :: new ()
-> add ( Post ::class, ' title ' )
-> addFullText ( Video ::class, ' title ' , [ ' mode ' => ' boolean ' ])
-> addFullText ( Blog ::class, [ ' title ' , ' subtitle ' , ' body ' ], [ ' mode ' => ' boolean ' ])
-> search ( ' framework -css ' );
如果要搜尋關係,則需要傳入一個數組,其中數組鍵包含關係,而值是列數組:
Search :: new ()
-> addFullText ( Page ::class, [
' posts ' => [ ' title ' , ' body ' ],
' sections ' => [ ' title ' , ' subtitle ' , ' body ' ],
])
-> search ( ' framework -css ' );
MySQL 內建有soundex演算法,因此您可以搜尋聽起來幾乎相同的術語。您可以透過呼叫soundsLike
方法來使用此功能:
Search :: new ()
-> add ( Post ::class, ' framework ' )
-> add ( Video ::class, ' framework ' )
-> soundsLike ()
-> search ( ' larafel ' );
這裡不多解釋,但這也是支持的:)
Search :: add ( Post :: with ( ' comments ' ), ' title ' )
-> add ( Video :: with ( ' likes ' ), ' title ' )
-> search ( ' guitar ' );
您可以在不使用術語或使用空術語的情況下呼叫search
方法。在這種情況下,您可以丟棄add
方法的第二個參數。使用orderBy
方法,您可以設定要排序的欄位(以前是第三個參數):
Search :: add ( Post ::class)
-> orderBy ( ' published_at ' )
-> add ( Video ::class)
-> orderBy ( ' released_at ' )
-> search ();
您可以使用count
方法計算結果數量:
Search :: add ( Post :: published (), ' title ' )
-> add ( Video :: where ( ' views ' , ' > ' , 2500 ), ' title ' )
-> count ( ' compile ' );
您可以使用includeModelType
將模型類型新增至搜尋結果。
Search :: add ( Post ::class, ' title ' )
-> add ( Video ::class, ' title ' )
-> includeModelType ()
-> paginate ()
-> search ( ' foo ' );
// Example result with model identifier.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " Post " ,
},
{
"id": 1 ,
"title": "foo",
"subtitle": null ,
"published_at": null ,
"created_at": " 2021-12-03T09:39:10.000000Z " ,
" updated_at ": " 2021 - 12 - 03 T09 : 39 : 10.000000 Z ",
" type ": " Video ",
},
],
...
}
預設情況下,它使用type
鍵,但您可以透過將鍵傳遞給方法來自訂它。
您也可以透過在模型中新增公用方法searchType()
來覆寫預設的類別基名稱來自訂type
值。
class Video extends Model
{
public function searchType ()
{
return ' awesome_video ' ;
}
}
// Example result with searchType() method.
{
" current_page ": 1 ,
" data": [
{
" id " : 1 ,
" video_id " : null ,
" title " : " foo " ,
" published_at " : null ,
" created_at " : " 2021-12-03T09:39:10.000000Z " ,
" updated_at " : " 2021-12-03T09:39:10.000000Z " ,
" type " : " awesome_video " ,
}
],
...
您可以將解析器與parseTerms
方法一起使用:
$ terms = Search :: parseTerms ( ' drums guitar ' );
您也可以傳入回呼作為第二個參數來循環每個術語:
Search :: parseTerms ( ' drums guitar ' , function ( $ term , $ key ) {
//
});
composer test
請參閱變更日誌以了解有關最近更改內容的更多資訊。
詳細資訊請參閱貢獻。
Inertia Table
:內建查詢產生器的 Inertia.js 終極表。Laravel Blade On Demand
:用於在記憶體中編譯 Blade 模板的 Laravel 套件。Laravel Eloquent Scope as Select
:停止在 PHP 中重複 Eloquent 查詢範圍和約束。該套件允許您透過將查詢範圍和約束新增為子查詢來重複使用它們。Laravel FFMpeg
:該軟體包為 Laravel 提供了與 FFmpeg 的整合。文件的儲存由 Laravel 的檔案系統處理。Laravel MinIO Testing Tools
:針對 MinIO S3 伺服器執行測試。Laravel Mixins
:Laravel 好東西的集合。Laravel Paddle
:Laravel 的 Paddle.com API 集成,支援 webhooks/事件。Laravel Task Runner
:編寫像 Blade Components 這樣的 Shell 腳本並在本地或遠端伺服器上運行它們。Laravel Verify New Email
:此軟體套件新增了驗證新電子郵件地址的支援:當使用者更新其電子郵件地址時,在驗證新電子郵件地址之前,它不會取代舊電子郵件地址。Laravel XSS Protection
:Laravel 中間件可保護您的應用程式免受跨站點腳本(XSS)的侵害。它清理請求輸入,並且可以清理 Blade echo 語句。如果您發現任何與安全相關的問題,請發送電子郵件至 [email protected],而不是使用問題追蹤器。
麻省理工學院許可證 (MIT)。請參閱許可證文件以獲取更多資訊。
這個包是Treeware。如果您在生產中使用它,我們要求您向世界購買一棵樹,以感謝我們的工作。透過為 Treeware 森林做出貢獻,您將為當地家庭創造就業機會並恢復野生動物棲息地。