TYPO3: Extbase-Datenbank-Query: Contains mit einem Array

27. September 2016

TYPO3 - Extbase-Datenbank-Query: Contains mit einem ArrayHeute 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

Ähnliche Artikel:

Meta-Daten



Auch mal Kommentieren:

Kommentar