Zum Inhalt springen

extbase query: Wort in kommasepariertem String und 'contains'

Erstellt am 12. Dezember 2012 · 2 Antworten · letzte Antwort am 20. Dezember 2012

Tags: Datenbank, Frage

zabinetta ·

Liebe Listenfreunde,

ich will mit einer Extbase-Extension Datenbank-Listen erstellen, und die Abfrage soll man im Backend konfigurieren können.
einiges klappt auch schon, aber jetzt wundere ich mich und würde gerne verstehen.

Es gibt ein Feld, das eine Art Keywords enthält. kommasepariert.
ich brauche diese Keywords als constraints.
mein momentaner Ansatz ist:

// im Repository
...
//nach untergruppe
	if ($settings['untergruppe']) {
		$suchUg = array();
		$suchUg = explode(',',$settings['untergruppe']);
		$suchUgConstraints = array();
		for($i=0; $i < count($suchUg); $i++) {
			$suchUgConstraints[] = $query->equals('relLga.lgUntergrup', $suchUg[$i]);
			$suchUgConstraints[] = $query->like('relLga.lgUntergrup', '%,' . $suchUg[$i] . ',%');
			$suchUgConstraints[] = $query->like('relLga.lgUntergrup', $suchUg[$i] . ',%');
			$suchUgConstraints[] = $query->like('relLga.lgUntergrup', '%,' . $suchUg[$i]);
		}
		$constraints[] = $query->logicalOr($suchUgConstraints);
                //das hier geht nicht:
      		//$constraints[] = $query->contains('relLga.lgUntergrupArray', $settings['untergruppe']);
		
    	}
...
//im Model
         /**
	 * Untergruppe
	 *
	 * @var string
	 */
	protected $lgUntergrup;
...
         /**
	 * Returns the lgUntergrup
	 *
	 * @return string $lgUntergrup
	 */
	public function getLgUntergrup() {
		return $this->lgUntergrup;		
	}

das geht auch.
aber da gibt es doch auch diese andere Methode mit 'contains', die viel eleganter aussehen würde.
naja, dachte ich, vielleicht mag 'contains' ja ein array haben.
aber wie krieg ich das?
hm, hab ich gedacht, wofür hab ich das model.
also eine property eingeführt, die mir lgUntergrup als array liefert. (es kann sein daß das hier jemandem der sich auskennt die Zehennägel aufbiegt vor unsauberkeit, wenn ja, dann mir bitte in der Richtung einen Tipp geben, denn es gibt kaum einen der so sehnlich drauf wartet, daß http://extbase.typo3.org/ endlich erreichbar sein wird, wie mich)

//model
	/**
	 * Untergruppe
	 *
	 * @var string
	 */
	protected $lgUntergrup;
	/**
	 * Untergruppe-Array
	 *
	 * @var array
	 */
	protected $lgUntergrupArray = array();
...
        /**
	 * Returns the lgUntergrup
	 *
	 * @return string $lgUntergrup
	 */
	public function getLgUntergrup() {
		return $this->lgUntergrup;		
	}
	/**
	 * Returns the lgUntergrupArray
	 *
	 * @return array $lgUntergrupArray
	 */
	public function getLgUntergrupArray() {
		$this->lgUntergrupArray = explode(",", $this->lgUntergrup);
		return $this->lgUntergrupArray;
	}

im Fluid-Template krieg ich das array, und kanns debuggen.
aber in den constraints kann ich es nicht verwenden (fehler: Unsupported or non-existing property name "lgUntergrupArray" used in relation matching. )
also: welchen Datentyp kann ich für "contains" verwenden?

bin für jegliche Hinweise dankbar,
Sabine

P.S: das hier ist momentan in TYPO3 4.6, aber ich wäre froh wenn mir der krempel nicht beim nächsten Update um die Ohren fliegt, sonst würde ich hier auch niemanden damit nerven wollen :o

zabinetta ·

Hallo Einprägsam,
naja, der erste Workaround funktioniert ja auch 🙂,
und wenn man erst einsteigt wie ich, kommt man manchmal auf so Ideen..

den Thread hab ich mir angesehen, aber das ist doch etwas anderes als bei mir, er will zwei Arrays vergleichen.
aber bei mir geht contains auch nicht mit einem einzigen Keyword zu vergleichen
ich vermute der Unterschied zwischen Christians 'tags'-Property und meiner 'lgUntergrupArray'-Property ist, daß hinter 'tags' (wahrscheinlich) ein eigenes Domain-Model steht, während ich das lgUntergrupArray schnell mal aus der Kommaliste explodiert hab.
Ich habe das Gefühl, daß beim Erzeugen der Datenbankabfrage dann irgendwie rauskommt, daß mein Array so gar nicht in der Datenbank ist...