Zum Inhalt springen

Extbase SQL Join

Erstellt am 11. Januar 2015 · 2 Antworten · letzte Antwort am 19. Januar 2015

Tags: Datenbank, Frage

Halion ·

Hallo Typo3 Community,

ich baue gerade eine Extbase Extension, in welcher ich in meiner Haupttabelle eine Relation zu einer Tabelle namens "zipcode" nutze, dort gibt es einen Start und einen End Wert um einen PLZ Bereich zu definieren. Ein Datensatz kann nun mehrere Zipcode Relationen besitzen.

Nun würde ich gerne eine PLZ Suche bauen wo man seine PLZ eingeben kann und geprüft werden soll welche der zipcode Relationen darin liegen.

Muss ich hier einen JOIN Statement bauen? Wenn ja, Wie müsste der aussehen?
Oder gibt es eine andere Möglichkeit?

Vielen Dank für Eure Hilfe
Halion

toifel ·

Wenn dein Model deinen Anforderungen entsprechend konfiguriert ist, dann sollte die Relation bereits vom Repository berücksichtigt werden.
Falls die "zipcode" Tabelle aber gar nicht als Model existiert hast du bereits die 2 wichtigsten Stichworte zu der Lösung genannt: JOIN und STATEMENT.

Mit $query->statement() kannst du manuelle Queries erstellen und bist nicht mehr an das Extbase Model und die Repository-Funktionen gebunden.

SELECT user.* FROM usertable LEFT JOIN zipcode ON (user.X = zipcode.Y) WHERE...
Halion · · Beste Antwort

Danke für deine Antwort.

Ich habe mir an der Stelle eine Funktion im Repository erstellt welche mir ein/mehrere Objekt(e) anhand eines Querys zurück gibt.

Vielleicht hilt es ja anderen:

public function deliverFromZiprange($zip) {

		//$party = intval($zip);

		$query = $this->createQuery();

		$query->getQuerySettings()->setRespectStoragePage(false);

		return $query->statement("
			SELECT tx_entities_domain_model_party.*
			FROM tx_entities_domain_model_party
			LEFT JOIN tx_entities_domain_model_zipcoderange
			ON tx_entities_domain_model_party.uid = tx_entities_domain_model_zipcoderange.party
			WHERE tx_entities_domain_model_zipcoderange.zipcode_start <= {$zip}
			AND tx_entities_domain_model_zipcoderange.zipcode_end >= {$zip}
		")
			->execute();

Funktioniert tadellos!

Der Aufbau eines Joins folgt diesem Aufbau:

SELECT DISTINCT oberobjekt.*

    FROM oberobjekt

    LEFT JOIN unterobjekt ON oberobjekt.uid=unterobjekt.oberobjekt

    WHERE (oberobjekt.title LIKE '%test%' OR unterobjekt.title LIKE '%test%')

    AND oberobjekt.deleted=0 AND (...)

    AND unterobjekt.deleted=0 AND (...)

Viel Spass!