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
trait to model и $searchable
свойство с доступными для поиска столбцами.
App \ Model \ User. php:
class User extends Authenticatable
{
use Searchable;
public $searchable = ['firstName', 'lastName'];
3) Используйте область поиска:
$users = User::search($search_value)->get();
или с указанными c столбцами:
$users = User::search($search_value, ['firstName', 'lastName', 'role.title'])->get();
Теперь вы можете использовать эту черту со всеми вашими моделями и столбцами моделей поискового лотка и столбцами отношений модели.
Первый аргумент принимает запрос, второй аргумент принимает столбцы или столбцы отношений с точками (relation.column
).
Мы разбиваем запрос на слова и ищем совпадения всех слов в разных столбцах.