Zum Inhalt springen

Syntax für MySQL

Erstellt am 13. September 2013 · 4 Antworten · letzte Antwort am 20. September 2013

Tags: Datenbank, Frage

boJahJah ·

Hallo zusammen,

ich habe noch einmal eine Frage zu "voneinander abhängigen Select-Feldern" im Backend, genauer: Zur richtigen Syntax bei der Datenbankabfrage.

Das eine Feld heißt "Berufsbezeichnung" und das andere heißt "Fachrichtung".
Zuerst wird die Berufsbezeichung ausgewählt und davon abhängig ein Select-Feld gezeigt, das entsprechende Fachrichtungen anbietet.

Hier der Teil des Codes aus der ext_tables.php zum besseren Verständnis:

'berufsbezeichnung' => array(
   'label' => 'Berufsbezeichnung',
   'config' => array(
      'type' => 'select',           
      'items' => array(
         array('Bitte wählen…', 0),
      ),		    
      'foreign_table' => 'tx_stellenliste_domain_model_beruf',
      'maxitems' => 1
      )
),
'fachrichtung' => array(
   'label' => 'Fachrichtung',
   'displayCond' => 'FIELD:berufsbezeichnung:!=:0',
      'config' => array(
         'type' => 'select',
	 'items' => array(
	    array('Bitte wählen…', 0),
	 ),		
	 'foreign_table' => 'tx_stellenliste_domain_model_fachrichtung',
	 'foreign_table_where' => 'AND tx_stellenliste_domain_model_fachrichtung.klickweg LIKE %###REC_FIELD_berufsbezeichnung###%',
	 'maxitems' => 1
      )
),

Für jeden Eintrag wird einer Berufsbezeichnung genau eine Fachrichtung zugeordnet. Welche Fachrichtung in Frage kommt (und entsprechend im Select-Feld angezeigt wird), wird in der Tabelle "tx_stellenliste_domain_model_fachrichtung" als kommaseparierte Liste gespeichert (z.B. "1,2,3,4,5" ). Die Fachrichtungen können also jeweils einigen, aber nicht allen Berufsbezeichnungen zugeordnet werden.

Wie ist nun die richtige Syntax, um abzufragen, ob die Berufsbezeichnung in der Liste der Fachrichtungen auftaucht?

'foreign_table_where' => 'AND tx_stellenliste_domain_model_fachrichtung.klickweg LIKE %###REC_FIELD_berufsbezeichnung###%',

Wenn ich das richtig sehe, ist die Zusammensetzung %###REC_FIELD_berufsbezeichnung###% nicht korrekt. Es funktioniert ohne %, wenn nur ein Wert in dem abzufragenden Feld steht. Es funktioniert auch mit %, wenn eine statische Zahl statt einer Variable eingesetzt ist. Nur zusammen nicht.
Ich würde mich sehr freuen, wenn mir da jemand weiterhelfen könnte.

boJahJah · · Beste Antwort

Ich habe die Lösung dann doch noch selber gefunden. Die Vermutung war richtig; die Syntax war falsch. Richtig sieht es jetzt so aus:

'foreign_table_where' => 'AND tx_stellenliste_domain_model_fachrichtungen.klickweg LIKE CONCAT("%", ###REC_FIELD_berufsbezeichnung###, "%")',

Vielleicht hilft es ja jemandem.

Unbekannter Benutzer ·

Kommaseparierte Listen sind eigentlich eine eher schlechte Lösung besser wäre eine MM Tabelle. Zumindest solltest Du lieber ein "AND ###REC_FIELD_berufsbezeichnung### IN tx_stellenliste_domain_model_fachrichtungen.klickweg" benutzen wenn das funktioniert... Denn deine Query wird nicht mehr funktionieren wenn die IDs zweistellig werden, denn wenn
tx_stellenliste_domain_model_fachrichtungen.klickweg = 2,10 dann würde LIKE %1% auch zutreffen...

boJahJah ·

Danke für die Rückmeldung. Ich habe folgendes mal ausprobiert, aber so bekomme ich eine Fehlermeldung. Bei meiner Anwendung sind die IDs zum Glück nur einstellig. Werd mich mit der MM Tabelllen-Alternative aber einmal auseinandersetzen. Das scheint nachhaltiger.

'fachrichtung' => array(
   'label' => 'Fachrichtung',
   'displayCond' => 'FIELD:berufsbezeichnung:!=:0',
   'config' => array(
      'type' => 'select',
      'items' => array(
         array('Bitte wählen…', 0),
      ),		
      'foreign_table' => 'tx_stellenliste_domain_model_fachrichtungen',
      'foreign_table_where' => 'AND ###REC_FIELD_berufsbezeichnung### IN tx_stellenliste_domain_model_fachrichtungen.klickweg',
      'maxitems' => 1
      )
),
boJahJah ·

Ich habe das Ganze jetzt einmal mit MM Tabellen versucht:

'berufsbezeichnung' => array(
   'exclude' => 0,
   'label' => 'LLL:EXT:acstellenliste/Resources/Private/Language/locallang_db.xlf:tx_acstellenliste_domain_model_stellen.berufsbezeichnung',
   'config' => array(
   'type' => 'select',
   'foreign_table' => 'tx_acstellenliste_domain_model_berufsbezeichnungen',
   'minitems' => 0,
   'maxitems' => 1,
   ),
),
'fachrichtung' => array(
   'exclude' => 0,
   'label' => 'LLL:EXT:acstellenliste/Resources/Private/Language/locallang_db.xlf:tx_acstellenliste_domain_model_stellen.fachrichtung',
   'config' => array(
   'type' => 'select',
   'foreign_table' => 'tx_acstellenliste_domain_model_fachrichtungen',
   'MM' => 'tx_acstellenliste_berufsbezeichnungen_fachrichtungen_mm',
   'minitems' => 0,
   'maxitems' => 1,
   ),
),

Aber leider funktioniert das nicht wie es soll. Es werden einfach alle Einträge der Liste gezeigt. Liegt es daran, dass das Ganze in der TCA/Stellen.php Datei liegt? Andere Felder mit MM Tabellen, die sich auf z.B.

'MM' => 'tx_acstellenliste_stellen_erfahrungensonderbereiche_mm',

beziehen, funktionieren. Was mache ich da falsch?