Laravel Group & Count by Eloquent Relationship - PullRequest
       18

Laravel Group & Count by Eloquent Relationship

0 голосов
/ 04 февраля 2019

Я знаю, что этот вопрос уже задавался здесь: Группировка Laravel по красноречивым связям , но ответы даны с 2016 года, и, похоже, они не работают в 2019 году. Также мой вопрос более прост, так как мне нужно толькоодин уровень отношений.

Мой вопрос

A user имеет несколько элементов .Как узнать, сколько items пользователь имеет на каждый item_type с одним запросом?


Вот что я пытался:

Запрос типа

User::with(['items' => function($q){
  $q->groupBy('type');
});

возвращает эту ошибку:

Синтаксическая ошибка или нарушение доступа: 1055 Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'items.id', который функционально не зависит от столбцов в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by

Я попытался исправить эту ошибку с помощью следующего запроса:

User::with(['items' => function($q){
    $q->select('type', \DB::raw('count(*) as total'))
          ->groupBy('type');
});

Однако это возвращает коллекцию users, где каждый пользователь item коллекция пуста.

Можно ли как-то сгруппировать по отношению в запросе?

1 Ответ

0 голосов
/ 04 февраля 2019

Произошла ошибка:

Вы используете $ q в качестве аргумента закрытия, а внутри вы используете $ query.Также иногда я сталкивался с проблемой, когда мне приходилось передавать внешний ключ в закрытие запроса отношения, чтобы получить результаты:

<?php 

$userWithItems = User::with(['items' => function($q){
    $q->select('type', \DB::raw('count(*) as total'), 'user_id')
          ->groupBy('type');
});

Попробуйте один раз, удалив user_id, если он работает, тогда лучше.Во-вторых, вы не можете выбирать неагрегированные столбцы в MySQL, когда у вас есть групповой.Опция отключить only_full_group_by в конфигурациях mysql.Поэтому, скорее всего, user_id также не будет работать, если вы не отключите эту конфигурацию

...