Extbase: Suche mit "IN" mit vorgegebener Reihenfolge
Wenn man eine Suche nach einer Id-Liste macht um eine Anzahl Datensätze in einer bestimmten Reihenfolge anzuzeigen muss man zu einem kleinen Trick greifen.
$idList = "5,1,6,2,9,3"
$query = $this->createQuery();
$constraints = array();
$idArray = explode(',', $idList);
$query->matching($query->in('uid', $idArray));
return $query->execute();
SELECT * FROM table WHERE uid IN (5,1,6,2,9,3)
Diese Suche liefert nicht das gewünschte Ergebnis, da der IN Parameter des SELECT-Befehl die Datensätze nicht in der angegebenen Reihenfolge zurück liefert.
Um das gewünschte Ergebnis zu bekommen muss man die gewünschte Reihenfolge bei der Suche mit angeben.
SELECT * FROM table WHERE uid IN (5,1,6,2,9,3) ORDER BY uid=5 DESC, uid=1 DESC, uid=6 DESC, uid=2 DESC, uid=9 DESC, uid=3 DESC
Im Programm kann man das so lösen:
$idList = "5,1,6,2,9,3"
$query = $this->createQuery();
$constraints = array();
$idArray = explode(',', $idList);
$query->matching($query->in('uid', $idArray));
$ordering = array();
foreach ($idArray as $thisId) {
$ordering['uid=' . $thisId] = Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING;
}
$query->setOrderings ($ordering);
return $query->execute();