Tôi đang tạo một gói thư nơi các thư được nhóm theo mỗi liên hệ. Trên trang chỉ mục của tôi, tôi hiển thị các chủ đề khác nhau. Khi bạn bấm vào một chuỗi, nó sẽ hiển thị tất cả các tin nhắn được trao đổi giữa bạn và người liên hệ của bạn. Tôi sử dụng một Builder Query để hiển thị các chủ đề trên trang index của tôi:Trình tạo truy vấn và nhóm Theo hai cột trong Symfony2/Doctrine tạo các bản sao
$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
;
Nếu tôi có 3 mục, cho dụ:
+----+------+----+
| id | from | to |
+----+------+----+
| 1 | 1 | 2 |
+----+------+----+
| 2 | 2 | 1 |
+----+------+----+
| 3 | 1 | 2 |
+----+------+----+
tôi mong đợi:
+----+------+----+
| id | from | to |
+----+------+----+
| 3 | 1 | 2 |
+----+------+----+
Nhưng tôi nhận được :
+----+------+----+
| id | from | to |
+----+------+----+
| 2 | 2 | 1 |
+----+------+----+
| 3 | 1 | 2 |
+----+------+----+
Tôi đã tìm ra cách để làm điều đó SQL, sử dụng cùng một bí danh cho from_id và to_id:
SELECT id, from_id as c, to_id as c FROM Message WHERE c = 1 GROUP BY from_id, to_id
Nhưng tôi không biết cách thực hiện với Doctrine.
EDIT:
Cho đến khi tôi có ý tưởng tốt hơn, tôi sử dụng khóa để dễ dàng "nhóm theo".
// 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();
thử selectiong chỉ id thêm '$ qb-> chọn ("m.to, m.from");' – Matteo
tôi đã cố gắng $ q = $ em-> createQueryBuilder() -> chọn ('m.to, m.from') -> từ ('MyAppDiscussionBundle: Message', 'm') ... nhưng tôi gặp lỗi: [Semantical Error] line 0, col 9 near 'to, m.from FROM ': Lỗi: Đường dẫn không hợp lệ. Phải là StateFieldPathExpression. – Eddy
Bạn đang mong đợi điều sai trái. Trong SQL, sử dụng 'GROUP BY from_id, to_id' có nghĩa là từ 1 đến 2 và từ 2 đến 1 là 2 nhóm khác nhau. – Jean