May 13, 2016

Eloquent: фильтр по hasMany

Originally published at О разработке для Android и гаджетах. Please leave any comments there.

Мысли в одну строку: есть модель, у которой может быть множество других моделей. Такая связь указывается с помощью метода hasMany

public function variant() {
   return $this -> hasMany("App\\Models\\Variant");
}

При этом, если вы не знали или знали, но забыли, связать объект Variant с парентом можно с помощью belongsTo

public function shedule(){
   return $this -> belongsTo("App\\Models\\Shedule");
}

Так вот, возникла необходимость получить список shedules, и в них провести фильтрацию объектов variant. Странно, но пришлось немного покопаться как на laracast.com, так и на прочих stackoverflow. Разгадка оказалась проста, хотя пришлось перепробовать много разных вариантов.

$list = Shedule::where('company_id', $this -> company -> id)
    -> with(['variant' ->  function ($query) use ($agencyId) {
         $query -> where('shedule_variants.agency_id', $agencyId);
}]);

В этом случае в метод with надо передать массив данных с фильтрами.
Особый интерес у меня вызывает список sql запросов при рендеринге каждой страницы, но это уже другой вопрос.