За последние 24 часа нас посетили 20276 программистов и 1087 роботов. Сейчас ищут 759 программистов ...

Выборка отфильтрованных элементов из бд

Тема в разделе "Laravel", создана пользователем Dasderdas, 24 янв 2023.

  1. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Есть метод поиска который возвращает булевое значение, он принимает 1 запись из базы данных и поисковый запрос. Как вытягивать из бд только те записи к котором метод search вернёт true? Причём необходимо именно вытягивать их, а не получить коллекцию а после фильтровать, т.к тогда не получается воспользоваться пагинацией.
    Если короче: Как получать только проверенные данные из бд а после пагинировать их? И возможно ли это вообще?
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    Возможно всё....
    Покажите свои наработки
     
  3. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Не понимаю какие наработки вас интересуют из вопроса. Всё что я делал просто не поддаётся исправлению т.к потенциально не может быть рабочим. Тут просто технический вопрос, совмещения кастомной фильтрации и нативной пагинации laravel, и нет повода предполагать что это возможно. Вот код как это должно было выглядеть:
    PHP:
    1. $searchQuery = $request->validated()['search'];
    2. $checkHandler = new Search;
    3. $goods = Goods::all();
    4. foreach ($goods as $key => $t) {
    5.     if ($checkHandler->Search($searchQuery, $t)) {
    6.         $goods->pull($key);
    7.     }
    8. }
    9. $goods->paginate(15);
    Код не может быть рабочим т.к $goods это коллекция а метод paginate доступен только моделям.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    не понимаю - почему не использовать where в запросе?
    PHP:
    1. $goods = Goods::where(....)-get();
    или если сырые данные whereRaw()

    а по всей базе построчно искать - при достаточном кол-ве ... я думаю от 1000 записей.. капец такому поиску
     
    #4 ADSoft, 25 янв 2023
    Последнее редактирование: 25 янв 2023
  5. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Мне необходимо реализовать поиск по названию товара(и не только но пока опуситим), для этого необходимо использовать регулярку. Как я должен в функции построения запросов использовать регулярное выражение? Данные для поиска не приходят такими как они записанные в бд. Мы не можем через условие подставлять данные для where(), так как на один результат поиска может быть найдено разные результаты. Поиск должен быть таким что-бы когда запрос например "а" мы получали все записи которые в названии имеют "а"
     
    #5 Dasderdas, 25 янв 2023
    Последнее редактирование: 25 янв 2023
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    847
    Симпатии:
    131
    БД умеют в регулярки, попробуй построить просто SQL-запрос, потом копай, как это в ларке исполнить.
     
  7. dantemgs

    dantemgs Новичок

    С нами с:
    24 дек 2022
    Сообщения:
    47
    Симпатии:
    9
  8. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Что-ж, окей, с названием так и поступил, спасибо.
    PHP:
    1. $goods = Goods::where('name', 'LIKE', '%' . $searchQuery . '%');
    А теперь самое сложное: как при этом ещё искать не только по названию а и по названию записей в той таблице что привязана к этой в отношении многие ко многим? Причём не среди выбранных, а именно в одном запросе
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    whereHas или join. Такое впечатление, что ты сам SQL достаточно мало знаешь. Огромное (по крайней мере для меня) преимущество Query Builder в ларке - максимальная близость к обычному SQL
    --- Добавлено ---
    Ну и кстати, whereHas описан хорошо в документации.
     
  10. Dasderdas

    Dasderdas Новичок

    С нами с:
    29 мар 2022
    Сообщения:
    69
    Симпатии:
    0
    Всё получилось. Всем спасибо за ответы. Как-то так вышло, если кому надо будет:
    PHP:
    1.     private function searchHandler($searchQuery)
    2.     {
    3.             return Goods::where(function ($query) use ($searchQuery) {
    4.                 $query->where('name', 'LIKE', '%' . $searchQuery . '%')
    5.                     ->orWhereHas('associations', function ($query) use ($searchQuery) {
    6.                         $query->where('title', 'like', '%' . $searchQuery . '%');
    7.                     });
    8.             });
    9.     }