php – Query Builder和Group By在Symfony2 / Doctrine两列产生重复

前端之家收集整理的这篇文章主要介绍了php – Query Builder和Group By在Symfony2 / Doctrine两列产生重复前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个消息包,其中消息按联系人分组.在我的索引页面上,我显示不同的线程.当您在一个线程上,它显示您和您的联系人之间交换的所有消息.我使用查询生成器来显示索引页面上的线程:
  1. $qb = $this->createQueryBuilder('m')
  2. ->where('m.from = ?1 or m.to = ?1')
  3. ->groupBy('m.to,m.from')
  4. ->orderBy('m.date','DESC')
  5. ->setParameter(1,$user->getId())
  6. ->setMaxResults($pagination) // limit
  7. ->setFirstResult($pagination * $page) // offset
  8. ;

如果我有3个条目,例如:

  1. +----+------+----+
  2. | id | from | to |
  3. +----+------+----+
  4. | 1 | 1 | 2 |
  5. +----+------+----+
  6. | 2 | 2 | 1 |
  7. +----+------+----+
  8. | 3 | 1 | 2 |
  9. +----+------+----+

我预计:

  1. +----+------+----+
  2. | id | from | to |
  3. +----+------+----+
  4. | 3 | 1 | 2 |
  5. +----+------+----+

但我得到:

  1. +----+------+----+
  2. | id | from | to |
  3. +----+------+----+
  4. | 2 | 2 | 1 |
  5. +----+------+----+
  6. | 3 | 1 | 2 |
  7. +----+------+----+

我发现了一种使用sql方法,对于from_id和to_id使用相同的别名:

  1. SELECT id,from_id as c,to_id as c FROM Message WHERE c = 1 GROUP BY from_id,to_id

但是我不知道怎么用原则去做.

编辑:

直到我得到一个更好的主意,我使用一个键轻松地“分组”.

  1. // entity
  2.  
  3. /**
  4. * @ORM\Column(name="key",type="string",length=40)
  5. */
  6. private $key;
  7.  
  8. /**
  9. * @ORM\PrePersist()
  10. */
  11. public function setOnPrePersist()
  12. {
  13. if($this->from < $this->to) {
  14. $key = $this->from . 't' . $this->to;
  15. } else {
  16. $key = $this->to . 't' . $this->from;
  17. }
  18.  
  19. $this->key = $key;
  20. }
  21.  
  22. // query builder
  23.  
  24. $qb = $this->createQueryBuilder('m')
  25. ->where('m.from = ?1 or m.to = ?1')
  26. ->groupBy('m.key')
  27. ->orderBy('m.date',$user->getId())
  28. ->setMaxResults($pagination) // limit
  29. ->setFirstResult($pagination * $page) // offset
  30. ;
  31.  
  32. return $qb->getQuery()->getResult();
尝试以下它使用doctrine DQL方法
  1. $query = $em->createQuery("SELECT m.id,m.from_id as c,m.to_id as c FROM AcmeDemoBunlde:Message as m WHERE m.c = 1 GROUP BY m.from_id,m.to_id");
  2.  
  3. $messageDetails = $query->getResult();

而不是AcmeDemoBundle替换为适当的包名称.

猜你在找的PHP相关文章