@Mo1she

Как жадно загрузить определённое количество связанных моделей?

У меня есть категории и новости и используется связь многие ко многим. Мне необходимо сделать запрос с использованием жадной загрузки, чтобы получить все категории и чтобы у каждой категории было только по три новости.

Я пробую сделать так:
$categories = Category::with('news')->orderBy('id', 'ASC')->get();

Но в этом случае запрашиваются все новости.

Ещё пробовал так:
$categories = Category::with(['news' => function($query)
        {
            $query->limit(3);
    }])->orderBy('id', 'ASC')->get();

Но в этом случае запрашивается всего три новости. Но мне ведь нужно по три штуки в кажой категории.

Подскажите пожалуйста как решить проблему. Спасибо.
  • Вопрос задан
  • 54 просмотра
Решения вопроса 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега Laravel
Судя по всему, никак:
The limit and take query builder methods may not be used when constraining eager loads.
https://laravel.com/docs/5.7/eloquent-relationship...
Ответ написан
@vism
так БД работает, иначе очень сложный запрос получается типо такого.
$articles = `SELECT category, id, title FROM (
    SELECT c.name AS category, a.id, a.title, row_number() OVER (PARTITION BY categoryid ORDER BY a.sort DESC) AS row
    FROM articles a INNER JOIN categories c ON (a.categoryid=c.dboid)
    ORDER BY c.sort
) AS foo WHERE row <= 5;


Поэтому, сперва получаете модели, а потом проходите по ним циклом и получаете все что относится к news
foreach ($categories as $category) {
         category->load(['news' => function($q){
                           $q->take(5);
                           }]);
    }


Можете также попробовать пакет
https://github.com/staudenmeir/eloquent-eager-limi...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы