TYPO3: Extbase-Datenbank-Query: Contains mit einem Array
Heute mal wieder etwas sehr technisches. Der Beitrag erklärt wie bei einer MM-Beziehung abgefragt werden kann, ob Werte aus einem Array Teil dieser Beziehung sind, sprich ein contains mit einem Array.
Folgende Situation: Ich habe eine Model Mitarbeiter, diese können mehreren Mitarbeitergruppen zugeordnet sein, also ein MM-Beziehung. Im Backend möchte ich per Plugin-Einstellungen eine Liste aller Mitarbeiter, die bestimmten Gruppen zugehörig sind erstellen. Zum Beispiel: Alle Mitarbeiter die zu Gruppe A gehören und alle Mitarbeiter die zur Gruppe B gehören. Dies führt zu folgender Action im Controller:
public function listByGroupsAction() {
$employees = $this->employeeRepository->findByGroups(GeneralUtility::trimExplode(',',$this->settings['groups']));
$this->view->assign('employees', $employees);
}
Im Repository entsteht dann folgendes Problem:
public function findByGroups($groups){
$query = $this->createQuery();
//Funktioniert nicht, da 'groups' mehrwertig ist
$query->matching($query->in('groups', $groups));
//Funktioniert nicht, da $groups mehrwertig ist
$query->matching($query->contains('groups', $groups));
return $query->execute();
}
Die beiden Methoden in und contains sind für diesen Fall nicht ausgelegt. IN formuliert: Enthält $groups den (einwertigen) Wert von groups CONTAINS formuliert: Enthält groups den (einwertigen) Wert $groups Was ich aber haben möchte ist: Enthält groups einen der Werte aus $groups. Man würde also annehmen, das folgendes gehen müsste:
$query->matching($query->contains('groups', $groups));
Allerdings ist hier eine Mehrdeutigkeit vorhanden. Ich könnte ja auch Fragen wollen: Enthält groups alle Werte aus $groups. Jetzt müsste man als im Prinzip das Array $groups iterieren und für jeden Eintrag ein OR-Constraint bauen. Das ist unschön und geht besser.
$query->matching($query->in('groups.uid', $groups));
In dem man auf groups.uid abfragt wird die Abfrage wie gewünscht gebaut. Der ORM liefert dann:
SELECT DISTINCT tx_ioew_domain_model_employee.* FROM tx_ioew_domain_model_employee
LEFT JOIN tx_ioew_employee_type_mm ON tx_ioew_domain_model_employee.uid=tx_ioew_employee_type_mm.uid_local
LEFT JOIN tx_ioew_domain_model_type ON tx_ioew_employee_type_mm.uid_foreign=tx_ioew_domain_model_type.uid
WHERE tx_ioew_domain_model_type.uid IN ('1','2') ...
Zu dieser Problematik gibt es auch ein Ticket: https://forge.typo3.org/issues/7848
Kommentare
Keine Kommentare