touhidurabir / eloquent-wherelike
一个扩展的laravel eloquent WHERE方法,用于与SQL LIKE运算符一起工作。
Requires
- php: >=7.4
Requires (Dev)
- orchestra/testbench: ^6.21
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-08-26 14:01:10 UTC
README
一个扩展的laravel eloquent WHERE方法,用于与SQL LIKE运算符一起工作。
灵感
这个包的灵感来源于Freek的一篇博客文章Freek的博客文章。我开发了这个宏,它是对那里描述的内容的略微不同的变体,并且已经使用它多年。所以我决定将其发布为一个包,这样我就不必再重复粘贴相同的代码,同时其他人也可以使用这个包节省一些时间。
安装
使用composer安装包
composer require touhidurabir/eloquent-wherelike
发布配置文件
php artisan vendor:publish --provider="Touhidurabir\EloquentWherelike\EloquentWherelikeServiceProvider" --tag=config
配置
配置文件包含一个重要的配置选项;operator,它定义了将用于执行查询的SQL运算符。默认设置为LIKE,但您可以按需更新它。例如,对于PostgreSQL,它应该设置为ILIKE。
用法
由于这个whereLike方法被定义为一个宏,所以就像使用任何eloquent方法一样使用它。
$users = User::whereLike(['email', 'name'], 'search_term')->get();
第一个参数将是搜索的目标列,第二个参数是实际的搜索词。
这个包的一个很大的优点是它允许基于模型关系进行搜索。例如,假设有一个用户有一个个人资料,个人资料表有first_name
和last_name
列。为了搜索姓氏匹配的用户,我们可以这样做
$users = User::whereLike( [ 'email', 'name', '.profile[first, last_name]' ], 'search_term' )->get();
请注意这里的语法
'.profile[first, last_name]'
开头的点(.)
定义了关系是什么,开闭的方括号([])定义了该关系模型/表的列。在这个例子中,我们也在查找个人资料关系的first_name
和last_name
列。
从我项目中的一个更高级的例子
$campaigns = $campaigns->whereLike( [ 'title', 'description', '.user.profile[first_name, last_name]', '.categories[name]', '.campaigntype[title]', '.team[name]' ], $search )->get();
在上面的例子中,我们正在根据不仅来自活动表列,还来自其关系模型列进行搜索的所有活动进行搜索。
现在,如果我们想在不使用此包的情况下编写整个内容,我们将不得不编写
$campaigns = $campaigns->where(function ($query) use ($search) { $query ->where('title', 'LIKE', '%' . $search . '%') ->orWhere('description', 'LIKE', '%' . $search . '%') ->orWhereHas('user', function($query) use ($search) { $query->whereHas('profile', function($query) use ($search) { $query->where('first_name', 'LIKE', '%' . $search . '%') ->orWhere('last_name', 'LIKE', '%' . $search . '%'); }); }) ->orWhereHas('categories', function($query) use ($search) { $query->where('name', 'LIKE', '%' . $search . '%'); }) ->orWhereHas('campaigntype', function($query) use ($search) { $query->where('title', 'LIKE', '%' . $search . '%'); }) ->orWhereHas('team', function($query) use ($search) { $query->where('name', 'LIKE', '%' . $search . '%'); }); })->get();
这种方式,whereLike节省了我们很多时间!🎉
贡献
欢迎提交拉取请求。对于重大更改,请首先打开一个问题以讨论您想要更改的内容。
请确保适当地更新测试。