findByUidListOrderByList

/**
 *  Find by multiple uids using, seperated string and maintain the list order
 *
 */
public function findByUidListOrderByList($uidList) {
	$uidArray = explode(',', $uidList);
	$query = $this->createQuery();
	$query->matching(
		$query->in('uid', $uidArray),
		$query->logicalAnd(
			$query->equals('hidden', 0),
			$query->equals('deleted', 0)
		)
	);
	$query->setOrderings($this->orderByField('uid', $uidArray));
	return $query->execute();
}

orderByField

/**
 *  Set the order method
 *
 */
protected function orderByField($field, $values) {
	$orderings = array();
	foreach ($values as $value) {
		$orderings["$field={$value}"] = \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING;
	}
	return $orderings;
}




Kommentare

j4k3 schrieb am 06.03.2017:
Hallo. Danke, hab ich so ähnlich übernommen. Kurze Anmerkung nur: besser, als einzelne Kriterien zusammen zu setzen, funktioniert die Sortierung nach einer uid-Liste mit dem mySQL-Befehl FIELD: "ORDER BY FIELD(uid, 1, 12, 17, 8)"

Malte Hommes schrieb am 05.10.2017:
Sehr schöne Lösung, Danke!

Jacco van der Post schrieb am 30.07.2018:
Hi, the ordering does not work anymore in 8.7. See for solution https://www.derhansen.de/2017/05/mysql-field-function-in-typo3-87-with-doctrine.html

TYPO3 Tiger schrieb am 09.04.2019:
Danke für den Hinweis. Allerdings funktioniert auch die von dir referenzierte Variante in 9.5.5 nicht mehr. Damit das dennoch läuft muss der DataMapper über den ObjectManager instanziert werden:

//$dataMapper = GeneralUtility::makeInstance(DataMapper::class);
$dataMapper = $this->objectManager->get(DataMapper::class);