Laravel 10 игнорирует "->where"

Рейтинг: 0Ответов: 2Опубликовано: 21.05.2023

Дано:

$items = Item::query()
            ->where('item_docs_id', '=', $itemDoc)
            ->when(RequestFacade::input('search'), function($query, $search) {
                $query->where('article', 'like', '%' . $search . '%')
                      ->orWhere('name_ru', 'like', '%' . $search . '%');

Т.е. есть модель, из которой мы берём данные для странички выборки документа, т.е. связь:

->where('item_docs_id', '=', $itemDoc)

Если производить поиск, пример по article:

->where('article', 'like', '%' . $search . '%')

Ищет по этому документу, без проблем. Но если:

->orWhere('name_ru', 'like', '%' . $search . '%');

то игнорирует:

->where('item_docs_id', '=', $itemDoc)

Вопрос, почему он игнорирует? Спасибо!

Ответы

▲ 0Принят

Помог такой запрос, но он большой, может есть что то элегантнее:

$items = Item::query()
            ->where('item_docs_id', '=', $itemDoc)
            ->when(RequestFacade::input('search'), function($query, $search) {
                $query->where('article', 'like', '%' . $search . '%');
            })
            ->orWhere('item_docs_id', '=', $itemDoc)
            ->when(RequestFacade::input('search'), function($query, $search) {
                $query->where('name_ru', 'like', '%' . $search . '%');
            })
            ->select('id', 'item_docs_id','article', 'brand', 'name_ru', 'name_en', 'purchase_price_original', 'amount', 'file_place')
            ->paginate(10)->withQueryString();

▲ 0

Попробуйте так, скорее всего неправильно группируются условия в конечном запросе (WHERE condition AND condition2 OR condition3 вместо WHERE condition AND (condition2 OR condition3))

 $items = Item::query()
         ->where('item_docs_id', '=', $itemDoc)
         ->when(RequestFacade::input('search'), function ($query, $search) {
             $query->where(function ($q) use ($search) {
                 $q
                     ->where('article', 'like', '%'.$search.'%')
                     ->orWhere('name_ru', 'like', '%'.$search.'%');
             });
         });