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();
versuchen selectiong nur die ID Zusatz '$ qb-> select ("m.to, m.from");' – Matteo
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
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