Pull to refresh

Comments 8

А вот на примере таблиц habrahabr.ru/post/229905/
как вывести product соеденив все 4 таблицы (товар, категорию товара, имена фильтров и их значения)
Product::includes('category', 'options')

где category — BelongsTo связь и будет загружена через джоин, options — HasMany связь и будет загружена отдельными запросами
То есть в запросе вы сможете опираться на поля продукта и категории, но не опций.
То вы наверняка знаете, что Eloquent производит загрузку связанных данных отдельным запросом и ни фильтрация, ни сортировки по ним работать не будут.


Ну, вообще-то, фильтровать можно:

$objects = Model::whereHas('relation', function($query) use ($filter)
{
    $query->whereFilter($filter);
})->get();


А насчет «упорядочить», это нужно подумать… возможно тоже что-то есть.
возможно даже это пройдет:
 $query->whereFilter($filter)->orderBy('order');
но я не берусь утверждать.
Если посмотреть на генерируемый запрос, то это не совсем то. Eloquent использует подзапрос для подсчета количества связанных записей, удовлетворяющих условию, соответственно с загрузкой это ничего общего не имеет. То есть по сути будет произведено целых два с половиной запроса (основной, в котором будет подзапрос считающий количество по фильтру, и запрос на загрузку связанных данных).

В моем же случае все это укладывается в один запрос, плюс на мой взгляд код чище.
Я и не говорил о количестве запросов. Я говорил о возможности фильтровать результат выборки по связанной модели.
В любом случае, join моделей будет полезен. Это как раз то, чего мне не хватало в первое время, когда я только начал работать c Eloquent.
Sign up to leave a comment.

Articles