这个 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 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。