TYPO3 / Extbase Repository: Find By Multiple UIDs (findByUids)

Heute mal wieder ein kleines Snippet, bei dem ich mich frage, warum so etwas nicht schon lange Standard bei Extbase ist. Wie dem auch sei, es geht es darum über ein Extbase Repository mehrere Datensätze anhand von UIDs zu finden, indem man einer Repository Funktion mehrere UIDs übergibt.

Häufig wird dies beispielsweise benötigt, wenn man in der Flexform eines Plugins einzelne Datensätze zur Anzeige auswählen kann. Diese Auswahl wird bei TYPO3 als ein kommaseparierter String gespeichert.
Diesen könnte man jetzt natürlich im Controller per Explode auftrennen und in einem Foreach mit findByUid durchlaufen, aber sowas würde möchte man doch in keinem Code Review verantworten müssen, oder?

Sowas gehört also in das Repository in eurer Extension. Der folgendem Funktion findByUids könnt ihr mehrere UIDs als kommaseparierten String übergeben, welcher dann aufgesplittet und in eine Query gepackt wird.

Pfad: typo3conf/ext/meine_extension/Classes/Domain/Repository/meinRepository.php

/**
 * Find by multiple uids using, seperated string. Found on blog.teamgeist-medien.de
 * 
 * @param string String containing uids
 * @return \TYPO3\meineExtension\Domain\Model\meinZurueckgegebensModel Matching model records
 */
public function findByUids($uids) {
    $uidArray = explode(",", $uids);
    $query = $this->createQuery();
    foreach ($uidArray as $key => $value) {
        $constraints[] =  $query->equals('uid', $value);
    }
    return $query->matching(
        $query->logicalAnd(
            $query->logicalOr(
                $constraints
            ),
            $query->equals('hidden', 0),
            $query->equals('deleted', 0)
        )
    )->execute();
}

Bitte denkt daran, den entsprechenden Rückgabewert in den Annotations an das entsprechende Model anzupassen.

5 Kommentare

  • Klappt gut. Fein wäre es, wenn das Ergebnis in der selben Reihenfolge wie die UID’s im String ausgebenen würden.

    •      /**
           *  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();
          }
          
           /**
           *  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;
          }
      

      Original hier gefunden
      http://www.buero-sonne.de/2014/10/16/mysql-orderby-field-in-extbase.html
      nur minimal angepasst. Dort gibt es auch noch andere Ansätze 😉

  • Pingback: Verwendet irgendjemand ernsthaft Exbase + Fluid zur Extension-Entwicklung??? - Seite 3

  • Danke fürs Snippet.

    Kleinigkeit: Der Rückgabewert laut phpdoc kann nicht passen. Wenn *mehrere* Treffer erzielt werden, kann es kein Objekt des Models sein.

    Viele Grüße
    Julian

Schreibe einen Kommentar zu Julian Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Highlighting von Codes ist mit den Tags  [ts], [php], [html], [javascript], [xml] oder [code] möglich.