微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在创建一个消息包,其中消息按联系人分组.在我的索引页面上,我显示不同的线程.当您在一个线程上,它显示您和您的联系人之间交换的所有消息.我使用查询生成器来显示索引页面上的线程:
$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',$user->getId())
    ->setMaxResults($pagination) // limit
    ->setFirstResult($pagination * $page) // offset
;

return $qb->getQuery()->getResult();
尝试以下它使用doctrine DQL方法
$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替换为适当的包名称.

原文地址:https://www.jb51.cc/php/132827.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐