Dieser Artikel beschreibt einige Grundsätze für das Verknüpfen von Datensätzen über MM-Relationen.
Relationen zwischen Datensätzen spielen in datenbankbasierten Anwendungen eine wichtige Rolle, spätestens wenn die Datensätze umfangreicher werden, bzw. Teilmengen der Daten an verschiedenen Stellen der Anwendung in verschiedenen Kontexten benötigt werden.
Ein typischer Anwendungsfall ist ein Produkt, dem ein Hersteller zugeordnet werden soll. Hierzu steht eine Auswahlliste zur Verfügung in welcher die verschiedenen Hersteller ausgewählt werden können, die dem Produkt zugeordnet sind.
Ansatz 1: Die kommaseparierte Liste
An dieser Stelle existieren nun zwei verschiedene Wege, wie eine derartige Relation realisiert werden kann. Der „althergebrachte“ Weg besteht darin, dass eine Liste der UIDs der Herstellerdatensätze in dem Feld des Produktdatensatzes gespeichert werden. Bei diesem Feld handelt es sich daher um ein Textfeld, in welchem die UIDs, mit Komma getrennt, eingetragen sind. Sollen nun die einzelnen Herstellernamen zusammen mit dem Produkt angezeigt werden, so muss der Inhalt des Datensatzfeldes geholt, in einzelne UIDs zerlegt und der Herstellername für jede einzelne UID aus der Herstellertabelle angefragt werden. Ein recht aufwendiger Weg, welcher sich nicht komplett mit SQL umsetzen lässt.
Ansatz 2: Relationstabellen
Der zweite Ansatz involviert eine zusätzliche Tabelle, die die Zuordnung der Datensätze der einzelnen Tabellen enthält. Diese Zuordnungstabelle enthält also die IDs der Produktdatensätze und die der Hersteller. Für jeden, dem Produkt zugeordneten Hersteller enthält diese Tabelle einen einzelnen Datensatz. Durch diese durchgängige Datenbanknormalisierung kann die Abfrage der Daten über die drei Tabellen (Produkt-, Hersteller- und Zuordnungstabelle mittels SQL erfolgen. Zeitgleich mit der Datenabfrage können weitere Kriterien und Filter in die SQL-Abfrage eingefügt werden, um die Datenabfrage weiter einzuschränken.
Um den Ansatz 2 weiter zu vereinfachen hat die Klasse t3lib_DB eine spezielle Funktion für diese MM-Abfrage. Der Namen der Funktion ist exec_SELECT_mm_query() welche die folgenden Parameter übernimmt:
- $select
- $local_table
- $mm_table
- $foreign_table
- $whereClause
- $groupBy
- $orderBy
- $limit
Die letzten vier Parameter, also angefangen mit $whereClause, haben jeweils Defaultwerte, können also bei Nichtgebrauch weggelassen werden.
Mit diesen Defaultwerten aufgerufen ist die Funktion sehr einfach anzuwenden:
$res = $GLOBALS['TYPO3_DB']->exec_SELECT_mm_query( $select, $local_table, $mm_table, $foreign_table);
Da die Funktion um den Aufbau einer MM-Relation in TYPO3 weiß, werden die Zuordnungen von lokaler und foreign UID automatisch beachtet. Dadurch dass ein JOIN über die Tabellen ausgeführt wird erhalten Sie als Ergebnis einen „Gesamtdatensatz“ der also die Felder des Produktes und zusätzlich die Felder des Herstellers enthält. Dies ist der Fall bei dem Aufruf der folgenden Funktion.
$ret = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
Möchte man nun statt aller Werte nur einen betsimmten erhalten, so muss selbiger abschliessend aus dem Ergebnissarray entnommen werden.
$manArray[$cnt] = $ret['manufacturer'];
Wird obige Funktion in einer Schleife für jeden Ergebnisdatensatz ausgeführt, so entsteht ein Array mit allen Herstellernamen.
Anmerkung: Wenn man eine MM-Relation im Kickstarter aufbau, so erhält die Produkttabelle ein Feld für die Relation. Allerdings wird in diesem Datenbankfeld KEIN Bezug zu einem Herstellerdatensatz eingesetzt. Die Zahl die Sie in diesem Datenbankfeld finden ist die Anzahl der in verbindung stehenden (Hersteller)-Datensätze. Haben Sie einem Produkt also vier Hersteller zugeordnet, so enthält das Feld die VIER. Dadurch kann ohne jeden weitern Aufwand abgefragt werden wieviele Hersteller ein Produkt ohne diese erst abfragen zu müssen.