Php 如何使用Elount实现包含搜索
我创建了一个搜索查询,其雄辩如下:Php 如何使用Elount实现包含搜索,php,laravel,eloquent,contains,Php,Laravel,Eloquent,Contains,我创建了一个搜索查询,其雄辩如下: User::where('firstName', 'like', '%' . $search_value . '%') ->orWhere('lastName', 'like', '%' . $search_value . '%') ->get(); 这是工作。但我需要搜索包含。例如,如果我的搜索值是helloworld,我应该找到值为world的行!好的,您好 我怎么做 1)您可以使用scope方法创建搜索特征 App\
User::where('firstName', 'like', '%' . $search_value . '%')
->orWhere('lastName', 'like', '%' . $search_value . '%')
->get();
这是工作。但我需要搜索包含。例如,如果我的搜索值是helloworld
,我应该找到值为world的行!好的,您好
我怎么做 1)您可以使用scope方法创建搜索特征
App\Traits\Searchable.php:
namespace App\Traits;
trait Searchable
{
public function scopeSearch($builder, $query, $columns = null)
{
if($query){
$words = explode(' ', $query);
$words = array_filter($words);
if(!$columns){
$columns = $this->searchable;
}
$builder->where(function ($builder) use ($words, $columns) {
foreach ($words as $word) {
$builder->where(function ($builder) use ($word, $columns) {
foreach ($columns as $column) {
if (strpos($column, '.') !== false) {
[$relation, $column] = explode('.', $column);
$builder->orWhereHas($relation, function ($query) use ($column, $word) {
$query->where($column, 'like', '%' . $word . '%');
});
} else {
$builder->oRwhere($this->getTable() . '.' . $column, 'like', '%' . $word . '%');
}
}
});
}
});
}
}
}
class User extends Authenticatable
{
use Searchable;
public $searchable = ['firstName', 'lastName'];
2) 将Searchable
trait添加到模型和带有可搜索列的$Searchable
属性
App\Model\User.php:
namespace App\Traits;
trait Searchable
{
public function scopeSearch($builder, $query, $columns = null)
{
if($query){
$words = explode(' ', $query);
$words = array_filter($words);
if(!$columns){
$columns = $this->searchable;
}
$builder->where(function ($builder) use ($words, $columns) {
foreach ($words as $word) {
$builder->where(function ($builder) use ($word, $columns) {
foreach ($columns as $column) {
if (strpos($column, '.') !== false) {
[$relation, $column] = explode('.', $column);
$builder->orWhereHas($relation, function ($query) use ($column, $word) {
$query->where($column, 'like', '%' . $word . '%');
});
} else {
$builder->oRwhere($this->getTable() . '.' . $column, 'like', '%' . $word . '%');
}
}
});
}
});
}
}
}
class User extends Authenticatable
{
use Searchable;
public $searchable = ['firstName', 'lastName'];
3) 使用搜索范围:
$users = User::search($search_value)->get();
或具有特定列:
$users = User::search($search_value, ['firstName', 'lastName', 'role.title'])->get();
现在,您可以将此特性用于所有模型,并通过“模型”列和“模型关系”列进行搜索
第一个参数接受查询,第二个参数接受带点的列或关系列(relation.column
)
我们将查询拆分为单词,并在不同的列中搜索所有匹配的单词。因此实现这一点的最简单方法是使用雄辩的宏:
使用illumb\Database\elount\Builder;
// ...
生成器::宏('whereLike',函数(字符串$attribute,字符串$searchTerm){
返回$this->orWhere($attribute,'LIKE',“%{$searchTerm}%”);
});
现在,您可以像这样搜索模型:
User::query()
->其中,like('name',$searchTerm)
->whereLike('email',$searchTerm)
->get();
有关该主题的更多信息,请参见:
和
您可以使用Laravel宏并创建一个宏,以完全满足您的需要。结账