Конструктор запросов Doctrine groupBy ошибка триггера sql_mode = only_full_group_by - PullRequest
1 голос
/ 05 мая 2020

Для сущности «Сообщение» мне нужно получить группу последних сообщений получателя по полю «Пользователь».

Вот сущность со своими связями:

/**
 * @ORM\Entity(repositoryClass="App\Repository\MessageRepository")
 */
class Message
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="messages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $User;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="receivedmessages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $receiver;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $text;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $creationdate;

Пока это это мой конструктор запросов в репозитории сообщений, чтобы получить последнее сообщение для получателя от пользователя:

public function getConversations($dest)
{
  $qb = $this
    ->createQueryBuilder('c')
    ->Where('c.receiver = :dest')
    ->setParameter('dest', $dest)
    ->orderBy('c.creationdate', 'DESC')
    ->groupBy('c.User')
  ;

  return $qb
    ->getQuery()
    ->getResult()
  ;
}

Когда я запускаю этот запрос, я получаю сообщение об ошибке:

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

В других шагах некоторые говорят, что нам нужно удалить ONLY_FULL_GROUP_BY из mysql консоли, чтобы избежать этой ошибки, некоторые другие говорят, что это не рекомендуется.

Есть ли другой способ выполнить мой запрос без изменения настроек базы данных?

РЕДАКТИРОВАТЬ: Я также попытался получить сообщение от пользователя репозитория вместо того, чтобы делать это из репозитория сообщений следующим образом:

public function getConversations($id)
{
  $qb = $this
    ->createQueryBuilder('u')
    ->andWhere('u.id = :val')
    ->setParameter('val', $id)
    ->Join('u.receivedmessages', 'd')
    ->groupBy('d.User')
    ->Select('d')
  ;

  return $qb
    ->getQuery()
    ->getResult()
  ;
}

В этом случае я получаю сообщение об ошибке:

[Семантическая ошибка] строка 0, столбец -1 рядом с 'SELECT d FROM': Ошибка: невозможно выбрать объект через идентификационные переменные, не выбрав хотя бы одну root псевдоним объекта.

...