Laravel Eloquent «с» возврат отношений с лимитом - PullRequest
0 голосов
/ 29 января 2019

У меня простые отношения Laravel между моделями Category и Article.Мне нужно вернуть список всех категорий с соответствующими статьями.

Данные испытаний: 3 категории и 15 статей (5 статей в каждой категории).
Ожидаемый результат: сборник всех категорий с 2 ​​последними соответствующими статьями для каждойкатегория

По умолчанию я должен использовать что-то вроде:

Category::with('articles')->get();

Все нормально - у меня есть 3 категории.Каждая категория имеет «отношения» с 5 связанными записями.

Далее я попробовал:

Category::with(['articles' => function ($query) {
    $query->orderBy('created_at', 'desc');
    $query->limit(2);
}])->get();

Но это неправильный путь.Эта конструкция в «сыром» запросе выглядит следующим образом:

select * from `articles` where `articles`.`category_id` in (select id from categories) limit 2

Так что он дал мне неверный результат, как и ожидалось ...
Мне нужны все категории и последние 2 статьи для каждой категории (3 * 2 =6 записей) этот запрос вернул только 2 записи

1 Ответ

0 голосов
/ 29 января 2019

В Laravel нет собственной поддержки.

Я создал для него пакет: https://github.com/staudenmeir/eloquent-eager-limit

Используйте черту HasEagerLimit как в родительской, так и в связанной модели.

class Category extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

class Article extends Model {
    use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
}

Тогда вы можете применить ->limit(2) к вашим отношениям.

...