2015-05-26 15 views
13

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(); 
+0

thử selectiong chỉ id thêm '$ qb-> chọn ("m.to, m.from");' – Matteo

+0

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

+0

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

Trả lời

0

Hãy thử nó sau bằng cách sử dụng phương pháp thuyết 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(); 

Thay vì AcmeDemoBundle thay thế với tên bó thích hợp của bạn.

+0

Nó không hoạt động nhưng tôi đang khám phá một giải pháp sử dụng DQL và IDENTITY() http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language .html – Eddy

1

trong trường hợp bạn có nhiều cột trong 'nhóm theo', bạn phải sử dụng phương thức 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 
; 

:)

Các vấn đề liên quan