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.

TYPO3 Datenbank Queries

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


Kommentar schreiben

* Diese Felder sind erforderlich