Php Symfony2/Doctrine中两列上的查询生成器和分组依据生成重复项

Php Symfony2/Doctrine中两列上的查询生成器和分组依据生成重复项,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我正在创建一个消息包,其中消息按联系人分组。在我的索引页上,我显示不同的线程。当你在一个线程上clic时,它会显示你和联系人之间交换的所有消息。我使用查询生成器在索引页上显示线程: $qb = $this->createQueryBuilder('m') ->where('m.from = ?1 or m.to = ?1') ->groupBy('m.to, m.from') ->orderBy('m.date', 'DESC') ->

我正在创建一个消息包,其中消息按联系人分组。在我的索引页上,我显示不同的线程。当你在一个线程上clic时,它会显示你和联系人之间交换的所有消息。我使用查询生成器在索引页上显示线程:

$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();

使用DQL方法尝试以下its原则-

$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"); 

$messageDetails = $query->getResult(); 

替换为适当的捆绑包名称,而不是AcmeDemoBundle。

如果“分组依据”中有许多列,则必须使用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
;

尝试仅选择添加$qb的id->selectm.to,m.from;我尝试了$q=$em->createQueryBuilder->选择'm.to,m.from'->从'MyAppDiscussionBundle:Message','m'。。。但我得到一个错误:[语义错误]第0行,第9列靠近“to,m.from”:错误:无效的PathExpression。必须是StateFieldPathExpression。您期望的是错误的内容。在SQL中,使用GROUP BY from_id和to_id意味着从1到2和从2到1是两个不同的组。有没有方法表明从to_id和from_id的数据是相同的,并在其上应用GROUP BY?这不起作用,但我正在探索使用DQL和IDENTITY的解决方案