1) 您可以使用范围方法创建搜索特征。
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 . '%');
}
}
});
}
});
}
}
}
2) 将Searchable 特征添加到模型和$searchable 具有可搜索列的属性。
App\Model\User.php:
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)。
我们将查询拆分为单词并在不同列中搜索所有匹配的单词。