Используя поле поиска в приложении, в базе данных есть 2 таблицы, как показано ниже:
________________
|**Services**
________________
|=>id
|=>name
|=>description
|=>other_columns
________________
и:
________________
|**Products**
________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________
=> каждый Услуга содержит много Продукты
=> Из-за формы окна поиска:
пользователь может выполнить поиск слова для products и по выбору выбрать услугу, таким образом, красноречие, которое я использую для получения результатов для:
если пользователь не выбрал конкретную услугу ищет в:
$data = Product::where('name','like',"%$search_value%")
->orWhere('description','like',"%$search_value%")
->orWhere('description_long','like',"%$search_value%")
->paginate($items_per_page);
если пользователь выбрал конкретную услугу:
$data = Product::where([
['name','like',"%$search_value%"],
['service_id','=',"%$service%"],
])
->orWhere([
['description','like',"%$search_value%"],
['service_id','=',"%$service%"],
])
->orWhere([
['description_long','like',"%$search_value%"],
['service_id','=',"%$service%"],
])
->paginate($items_per_page);
Отношения Модели выглядят следующим образом:
Продукт Модель:
public function service(){
return $this->belongsTo(Service::class);
}
Услуга Модель:
public function products(){
return $this->hasMany(Product::class);
}
В обоих случаях $data всегда содержат все строки продуктов. как добиться нужного результата?
Я читал документы whereRaw, но не могли бы вы объяснить разницу?
Почему вы тоже используете знаки процента в своих строках =?
Он должен быть таким же, но во всех предложениях используется следующий синтаксис: '%'.$search_input.'%'. Пожалуйста, попробуйте это.
Я пробовал '%'.$search_input.'%', но результат тот же
почему service_id имеет % в этих ['service_id','=',"%$service%"]? не должно быть так ['service_id','=',$service]?
@ AhmedNourJamalEl-Din, это проблема, она решила проблему .. не могли бы вы написать это как ответ, чтобы быть понятным другим? плюс еще одна небольшая проблема, я использую lorem text (притворщик) для создания фиктивных данных ... поэтому, если я ищу любое слово, оно всегда будет найдено, т.е. ищу слово лорема






Вы можете использовать when() для построения динамических запросов на основе вашего пользовательского ввода.
$data = Product::query()
->when($request->get('service_id') ,function($query, $service_id) {
$query->where('service_id', $service_id);
})
->where(function($query) use ($search_value) {
$query->where(('name', 'like', "%$search_value%"))
->orWhere('description', 'like', "%$search_value%")
->orWhere('description_long', 'like', "%$search_value%");
})
->paginate($items_per_page);
Вложив условия полнотекстового поиска в другое предложение where(), нам не нужно повторять часть where('service_id', $service_id) несколько раз.
Если вы используете опцию выбора All Services в своем интерфейсе с value = "all", вы также можете использовать следующее предложение when() вместо приведенного выше:
->when($request->filled('service_id') && $request->get('service_id') !== 'all', function ($query) use ($request) {
$query->where('service_id', $request->get('service_id'));
})
В % есть ['service_id','=',"%$service%"], и его нужно удалить ['service_id','=',$service].
% работает с LIKE, но не с =.
Если вы ищете способ улучшить свой поиск, ознакомьтесь с этим упаковка
используйте где Сырье вместо where.