Есть метод поиска который возвращает булевое значение, он принимает 1 запись из базы данных и поисковый запрос. Как вытягивать из бд только те записи к котором метод search вернёт true? Причём необходимо именно вытягивать их, а не получить коллекцию а после фильтровать, т.к тогда не получается воспользоваться пагинацией. Если короче: Как получать только проверенные данные из бд а после пагинировать их? И возможно ли это вообще?
Не понимаю какие наработки вас интересуют из вопроса. Всё что я делал просто не поддаётся исправлению т.к потенциально не может быть рабочим. Тут просто технический вопрос, совмещения кастомной фильтрации и нативной пагинации laravel, и нет повода предполагать что это возможно. Вот код как это должно было выглядеть: PHP: $searchQuery = $request->validated()['search']; $checkHandler = new Search; $goods = Goods::all(); foreach ($goods as $key => $t) { if ($checkHandler->Search($searchQuery, $t)) { $goods->pull($key); } } $goods->paginate(15); Код не может быть рабочим т.к $goods это коллекция а метод paginate доступен только моделям.
не понимаю - почему не использовать where в запросе? PHP: $goods = Goods::where(....)-get(); или если сырые данные whereRaw() а по всей базе построчно искать - при достаточном кол-ве ... я думаю от 1000 записей.. капец такому поиску
Мне необходимо реализовать поиск по названию товара(и не только но пока опуситим), для этого необходимо использовать регулярку. Как я должен в функции построения запросов использовать регулярное выражение? Данные для поиска не приходят такими как они записанные в бд. Мы не можем через условие подставлять данные для where(), так как на один результат поиска может быть найдено разные результаты. Поиск должен быть таким что-бы когда запрос например "а" мы получали все записи которые в названии имеют "а"
Что-ж, окей, с названием так и поступил, спасибо. PHP: $goods = Goods::where('name', 'LIKE', '%' . $searchQuery . '%'); А теперь самое сложное: как при этом ещё искать не только по названию а и по названию записей в той таблице что привязана к этой в отношении многие ко многим? Причём не среди выбранных, а именно в одном запросе
whereHas или join. Такое впечатление, что ты сам SQL достаточно мало знаешь. Огромное (по крайней мере для меня) преимущество Query Builder в ларке - максимальная близость к обычному SQL --- Добавлено --- Ну и кстати, whereHas описан хорошо в документации.
Всё получилось. Всем спасибо за ответы. Как-то так вышло, если кому надо будет: PHP: private function searchHandler($searchQuery) { return Goods::where(function ($query) use ($searchQuery) { $query->where('name', 'LIKE', '%' . $searchQuery . '%') ->orWhereHas('associations', function ($query) use ($searchQuery) { $query->where('title', 'like', '%' . $searchQuery . '%'); }); }); }