Laravel Eloquent - не получает нужные строки - PullRequest
0 голосов
/ 15 декабря 2018

Используя поле поиска в приложении, база данных имеет 2 таблицы, как показано ниже:

 ________________
|**Services**
 ________________
|=>id
|=>name
|=>description
|=>other_columns
________________

и:

 ________________
|**Products**
 ________________
|=>id
|=>name
|=>description
|=>service_id
|=>other_columns
________________

=> каждая Служба содержитмногие Продукты

=> В связи с формой окна поиска:

enter image description here

пользователь может искатьслово для products и опционально для выбора службы, поэтому красноречивое слово, которое я использую для получения результатов:

  1. , если пользователь не сделалвыберите конкретную услугу для поиска в:

    $data = Product::where('name','like',"%$search_value%")
            ->orWhere('description','like',"%$search_value%")
            ->orWhere('description_long','like',"%$search_value%")
            ->paginate($items_per_page);
    
  2. если пользователь выбрал конкретную услугу :

    $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);
    

Модели Отношения приведены ниже:

  1. Продукт Модель:

    public function service(){
        return $this->belongsTo(Service::class);
    }
    
  2. Сервис Модель:

    public function products(){
        return $this->hasMany(Product::class);
    }
    

В обоих случаях $data всегда содержит все строки продуктов.как добиться правильного результата?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Есть % в ['service_id','=',"%$service%"], и его следует удалить ['service_id','=',$service].

% работает с LIKE, а не с =.

0 голосов
/ 15 декабря 2018

Вы можете использовать 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'));
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...