Я создаю пакет сообщений, где сообщения группируются для контактов. На моей индексной странице отображаются разные потоки. Когда вы кликаете по одному потоку, он показывает все сообщения, обменянные между вами и вашим контактом. Я использую Query Builder для отображения потоков на моей индексной странице:
$qb = $this->createQueryBuilder('m') ->where('m.from = ?1 or m.to = ?1') ->groupBy('m.to, m.from') ->orderBy('m.date', 'DESC') ->setParameter(1, $user->getId()) ->setMaxResults($pagination) // limit ->setFirstResult($pagination * $page) // offset ;
Если у меня есть 3 записи, например:
+----+------+----+ | id | from | to | +----+------+----+ | 1 | 1 | 2 | +----+------+----+ | 2 | 2 | 1 | +----+------+----+ | 3 | 1 | 2 | +----+------+----+
Я жду:
+----+------+----+ | id | from | to | +----+------+----+ | 3 | 1 | 2 | +----+------+----+
Но я понимаю:
+----+------+----+ | id | from | to | +----+------+----+ | 2 | 2 | 1 | +----+------+----+ | 3 | 1 | 2 | +----+------+----+
Я нашел способ сделать это с помощью SQL, используя тот же псевдоним для from_id и to_id:
SELECT id, from_id as c, to_id as c FROM Message WHERE c = 1 GROUP BY from_id, to_id
Но я не знаю, как это сделать с Доктриной.
РЕДАКТИРОВАТЬ:
Пока я не получу лучшую идею, я использую ключ, чтобы легко «группировать».
// entity /** * @ORM\Column(name="key", type="string", length=40) */ private $key; /** * @ORM\PrePersist() */ public function setOnPrePersist() { if($this->from < $this->to) { $key = $this->from . 't' . $this->to; } else { $key = $this->to . 't' . $this->from; } $this->key = $key; } // query builder $qb = $this->createQueryBuilder('m') ->where('m.from = ?1 or m.to = ?1') ->groupBy('m.key') ->orderBy('m.date', 'DESC') ->setParameter(1, $user->getId()) ->setMaxResults($pagination) // limit ->setFirstResult($pagination * $page) // offset ; return $qb->getQuery()->getResult();
в случае, если у вас много столбцов в группе, вы должны использовать метод addGroupBy ().
$qb = $this->createQueryBuilder('m') ->where('m.from = ?1 or m.to = ?1') ->groupBy('m.to') ->addGroupBy('m.from') ->orderBy('m.date', 'DESC') ->setParameter(1, $user->getId()) ->setMaxResults($pagination) // limit ->setFirstResult($pagination * $page) // offset ;
🙂
Попробуйте следующее с помощью метода доктрины DQL –
$query = $em->createQuery("SELECT m.id, m.from_id as c, m.to_id as c FROM AcmeDemoBunlde:Message as m WHERE mc = 1 GROUP BY m.from_id, m.to_id"); $messageDetails = $query->getResult();
Вместо AcmeDemoBundle замените соответствующее имя пакета.