За последние 24 часа нас посетили 22258 программистов и 1179 роботов. Сейчас ищут 715 программистов ...

Как сделать фильтр по нескольким параметрам для запроса к БД со связанными таблицами?

Тема в разделе "Laravel", создана пользователем Сереганек, 20 сен 2018.

  1. Сереганек

    Сереганек Активный пользователь

    С нами с:
    18 янв 2017
    Сообщения:
    333
    Симпатии:
    27
    У меня есть набор фильтров: name, email, role, project, subproject, date_from, date_to и т.п. Нужно сделать выборку из БД таким образом, чтобы все заполненные фильтры участвовали в фильтрации.
    Все усложняется еще и тем, что имя и дата находятся в таблице day_reports. Остальные же параметры лежат в связанной таблице elementary_reports. Как здесь лучше сделать выборку из таблицы? Желательно через eloquent.

    Код (Text):
    1. class DayReport extends Model
    2. {
    3. protected $guarded = [];
    4. protected $dates = ['created_at', 'updated_at','reportdate'];
    5.  
    6. public function elementary()
    7. {
    8.     return $this->hasMany('App\ElementaryReport', 'day_reports_id', 'id');
    9. }
    Я понимаю, что нужно использовать конструкцию типа этой:

    Код (Text):
    1. DayReport::with('elementary')
    Пробовал сделать таким образом:

    Код (Text):
    1. $result =  DayReport::select('username')->with('elementary')
    2.         ->when(!empty($filters['name']) , function ($query) use($filters) {
    3.             return $query->where('username', 'LIKE', '%'.$filters['name'].'%');
    4.         })->get();
    Но как добавить еще один/несколько when для фильтрации по параметрам, которые лежат в таблице elementary_reports? Возможно ли это в принципе посредством eloquent?
     
  2. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Возможно.

    With - не к месту используешь. Тебе нужен join а не with, а если есть совпадающие имена полей, добавляй явное упоминание имени таблицы. Типа 'ementary_reports.hujnane'
    --- Добавлено ---
    Вообще лучше сначала поиграть с чистыми SQL запросами, а когда появится понимание целевого запроса, тогда только сформулировать то же самое средствами eloquent.
     
    Сереганек нравится это.
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    PHP:
    1. ->with(['rel' => function($query) {
    2.    $query->where(...)
    3. }]);
    4. // ну и далее по аналогии
     
    artoodetoo и Сереганек нравится это.