2015-05-26 3 views
13

Ich erstelle ein Nachrichtenpaket, wo Nachrichten pro Kontakte gruppiert werden. Auf meiner Indexseite zeige ich verschiedene Threads an. Wenn Sie auf einen Thread klicken, werden alle Nachrichten angezeigt, die zwischen Ihnen und Ihrem Kontakt ausgetauscht wurden. Ich benutze einen Query Builder, die Fäden auf meiner Index-Seite anzuzeigen:Abfrage-Generator und Gruppe Nach zwei Spalten in Symfony2/Doctrine generieren Duplikate

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

Wenn ich 3 Einträge, für exemple:

+----+------+----+ 
| id | from | to | 
+----+------+----+ 
| 1 | 1 | 2 | 
+----+------+----+ 
| 2 | 2 | 1 | 
+----+------+----+ 
| 3 | 1 | 2 | 
+----+------+----+ 

erwarte ich:

+----+------+----+ 
| id | from | to | 
+----+------+----+ 
| 3 | 1 | 2 | 
+----+------+----+ 

Aber ich :

+----+------+----+ 
| id | from | to | 
+----+------+----+ 
| 2 | 2 | 1 | 
+----+------+----+ 
| 3 | 1 | 2 | 
+----+------+----+ 

Ich fand einen Weg, es zu tun SQL, mit dem gleichen Alias ​​für from_id und to_id:

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

Aber ich weiß nicht, wie es mit Lehre zu tun.

EDIT:

Bis ich eine bessere Vorstellung zu bekommen, verwende ich einen Schlüssel zu leicht „Gruppe“.

// 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

versuchen selectiong nur die ID Zusatz '$ qb-> select ("m.to, m.from");' – Matteo

+0

Ich habe versucht, $ q = $ Ausführungs> createQueryBuilder() -> wähle ('m.to, m.from') -> aus ('MyAppDiscussionBundle: Message', 'm') ... aber ich bekomme einen Fehler: [Semantical Error] Zeile 0, Spalte 9 nahe 'zu, m.from FROM: Fehler: Ungültiger Pfadausdruck. Muss eine StateFieldPathExpression sein. – Eddy

+0

Sie erwarten das falsche Ding. In SQL bedeutet die Verwendung von GROUP BY from_id to_id, dass 1 bis 2 und 2 bis 1 2 verschiedene Gruppen sind. – Jean

Antwort

0

Versuchen Sie, die nach ihrer durch Lehre DQL-Methode -

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

Statt AcmeDemoBundle mit entsprechenden Bundle-Namen ersetzen.

+0

Es funktioniert nicht, aber ich erkläre eine Lösung mit DQL und IDENTITY (http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language) .html – Eddy

1

Falls Sie viele Spalten in 'group by' haben, müssen Sie die Methode addGroupBy() verwenden.

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

:)

Verwandte Themen