Repository Query mit constrains

Im Abschnitt "eigene Repository Queries" hatte ich die logischen Verknüpfungs- und Abfragemöglichkeiten in Extbase Repositories beschrieben. Dabei hat die Query immer einen oder mehrere Parameter erwartet, der dann mit dem Datenbankinhalt verglichen wurde.

Wenn wir aber in einem Formular flexible Filter setzten wollen, müssen unsere Query Bedingungen optional werden.

Beispiel:

Wir haben Adressdatensätze die wir optional nach Vorname, Name, PLZ oder Ort filtern wollen.

Die Controllerfunktion

Im Controller definieren wir zunächst unsere Variabeln und weisen diesen die Werte aus dem Forumlar zu:

if($form['firstname']) {
    $filter_firstname = $form['firstname']; } else {
     $filter_firstname = null;
}

//Kurzform:
($form['firstname']) ? $filter_firstname = $form['firstname'] : $filter_firstname = null;
($form['name']) ? $filter_name = $form['name'] : $filter_name = null;
...

Wichtig ist hier alle Variablen zu initialisieren damit die Parameterübergabe in der Funktion klappt.

Danach können wir unsere Query aufrufen:

$filtered_results = $this->myAdressRepository->findByFilter($filter_firstname, $filter_name, $filter_zip, $filter_city);

Die Repository Query

In der Query Funktion übernehmen wir die Parameter und bilden dann ein constrains Array. 

Hier der Funktion, weiter unten ein paar Erläuterungen:

 /**
  * Filter Query Funktion
  * @param string $filter_firstname
  * @param string $filter_name 
  * @param string $filter_zip
  * @param string $filter_city
  */
    public function findByFilter($filter_firstname, $filter_name, $filter_zip, $filter_city) {
        $query = $this->createQuery();
            
        //We need at least min 1 filterConstraint
        $filterConstraint[] = $query->greaterThan('uid', 0);

        if($filter_firstname != null) {
            $filterConstraint[] = $query->logicalOr(
                                                $query->equals('firstname', $filter_firstname),
                                                $query->like('firstname', '%' . $filter_firstname . '%)
                                                );

        }

        if($filter_name != null) {
            $filterConstraint[] = $query->logicalOr(
                                                $query->equals('name', $filter_name),
                                                $query->like('name', '%' . $filter_name . '%)
                                                );

        }

        // Hier müssen die constrains für die restlichen Filter Paramter ergänzt werden.

        // Aufbau der Query
       $query->matching(
            $query->logicalAnd($filterConstraint)
        );

        return $query->execute();
    }

Hinweise:
In der Query brauchen wir später mindestens eine Bedingung sonst schlägt die Funktion fehlt. Falls also gar keine Filterparameter gesetzt wurden greift immer noch unsere Bedingung "größer als UID 0", die eigentlich sonst sinnlos ist.

Danach prüfen wir jeden Filterparameter und bauen eine logicalOr Verknüpfung auf um auch Wortbestandteile zu suchen.

Die eigentliche Aufbau unserer Query erfolgt dann innerhalb einer logicalAnd Verknüpfung, da ich mit Filterparametern gewöhnlich die Suche einschränke.

 

Mit dieser Technik sind sowohl komplexe Abfragen mit optionalen Parametern an die Datenbank möglich, gleichwohl kann man auf diesem Weg auch kleinere Einzelfunktionen im Repository sinnvoll zusammenfassen.

Weitere Artikel zu diesem Thema:

Empfehlenswerte Lektüre:

TYPO3 Extbase: Moderne Extension-Entwicklung für TYPO3

Ein nahezu perfektes Buch für TYPO3 Extensionentwickler die mit Extbase und Fluid beginnen, aber auch erfahrene Entwickler finden noch Anregungen um ihre eigene Arbeit ständig zu verbessern. Sehr ausführlich, kurzweilig, kein Lesestoff für die Couch sondern eher ein Mitmachbuch das Spaß und Unterstützung bei der eigenen Extensionentwicklung bietet.

Kommentare

keine Kommentare vorhanden


Kommentar verfassen

Die Email Adresse wird nicht veröffentlicht.