Relation-Dropdowns
Verwandeln Sie eine rohe Fremdschlüsselspalte mit relation() in ein Dropdown, eine durchsuchbare Combobox oder ein Mehrfachauswahlfeld, aufgelöst gegen eine andere Tabelle.
Was relation() tut
relation() bindet eine echte, bearbeitbare Spalte der aktuellen Tabelle (z. B. payments.customerNumber) an ein Lookup gegen eine andere Tabelle. Das Erstellen-/Bearbeiten-Formular zeigt statt eines bloßen numerischen ID-Felds ein Dropdown mit den Zeilen dieser Tabelle, und die Liste zeigt anstelle der rohen ID den aufgelösten Namen.
$xcrud->relation(
'customerNumber', 'customers', 'customerNumber', 'customerName',
"country = 'USA'", null, false, ' ', null, null, null, true
);
Die Zieltabelle muss auf demselben Weg erreichbar sein wie jede andere Tabelle der Website - eine echte Tabelle, nicht gesperrt, mit einem einspaltigen Primärschlüssel. Sie braucht keine eigene CRUD-Seite; relation() kann eine Tabelle lesen, die sonst nirgendwo auf der Website direkt durchsucht wird.
Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
$field | string | - | Die echte, bearbeitbare Spalte dieser Tabelle, die gebunden wird (z. B. customerNumber). |
$targetTable | string | - | Die Tabelle, in der Werte nachgeschlagen werden. |
$targetId | string | - | Spalte in $targetTable, deren Wert zurück in $field gespeichert wird. |
$targetName | string|array | - | Spalte(n), die als Optionsbeschriftung angezeigt werden. Ein Array (z. B. ['contactFirstName', 'contactLastName']) wird mit $concatSeparator verbunden, um etwas wie "Vorname Nachname" anzuzeigen. |
$where | array|string|null | null | Schränkt ein, welche Zielzeilen angeboten werden. Ein Array ist sichere Spalte=>Wert-Gleichheit, per AND verknüpft und als Parameter gebunden. Ein String ist vertrauenswürdiges, vom Entwickler geschriebenes Roh-SQL (gleiches Vertrauensniveau wie where_raw()), optional mit {field}-Platzhaltern, die durch den eigenen Wert der aktuellen Zeile ersetzt werden. |
$orderBy | string|null | null | Sortierreihenfolge für die Optionsliste. |
$multi | bool | false | Rendert eine Mehrfachauswahl statt eines einzelnen Dropdowns; der gespeicherte Wert wird eine kommagetrennte Liste von IDs. |
$concatSeparator | string | ' ' | Trennzeichen, wenn $targetName ein Array von Spalten ist. |
$tree | mixed | null | Reserviert für ein zukünftiges hierarchisches/eingerücktes Baum-Dropdown - noch nicht implementiert; ein Nicht-Standardwert löst einen Fehler aus. |
$dependField | string|null | null | Spalte in $targetTable, nach der gefiltert wird, verglichen mit dem aktuellen Wert von $dependOn. Siehe Kaskadierende / abhängige Dropdowns. |
$dependOn | string|null | null | Name eines anderen, mit relation() konfigurierten Felds dieser Tabelle, dessen aktuelle Auswahl den obigen Filter steuert. |
$search | bool | false | Rendert eine durchsuchbare Combobox (ein Texteingabefeld, das die abgerufene Optionsliste beim Tippen filtert) statt eines einfachen <select> - nützlich, sobald es Dutzende Optionen gibt. Kombiniert sich mit $multi für entfernbare Chips. |
Die Optionsliste filtern
Die Array-Form von $where ist der sichere Standard - einfache, parametrisierte Gleichheit:
$xcrud->relation('catid', 'categories', 'cid', 'name', ['published' => 1]);
Die String-Form ist ein rohes SQL-Fragment für alles, was ein Gleichheits-Array nicht ausdrücken kann - sie ist vertrauenswürdiges, vom Entwickler geschriebenes SQL, niemals aus Benutzereingaben zusammengesetzt:
$xcrud->relation('customerNumber', 'customers', 'customerNumber', 'customerName', "country = 'USA'");
Unabhängig von der verwendeten Form wird die gesamte Relation-Konfiguration - Tabelle, ID-Spalte, Name-Spalte(n), Where, Order, Multi - mit XcrudConfig::$appSecret HMAC-signiert, genau wie ein einfacher where()-Filter, sodass sie nicht clientseitig umgeleitet oder erweitert werden kann.
subselect(): eine schreibgeschützte berechnete Spalte
Während relation() einen bearbeitbaren Fremdschlüssel auflöst, fügt subselect() eine reine Anzeigespalte hinzu, berechnet aus einem beliebigen korrelierten SQL-Ausdruck - nichts wird darin zurückgespeichert, und sie ist nie bearbeitbar, sortierbar oder durchsuchbar.
$xcrud->subselect(
'orderCount',
'SELECT COUNT(*) FROM orders o WHERE o.customerNumber = payments.customerNumber'
);
$field wird eine neue Spalte neben den echten Spalten der Tabelle und muss ein gültiger Bezeichner sein, der nicht bereits ein echter Spaltenname ist. $sql ist vertrauenswürdiges, vom Entwickler geschriebenes SQL - wie der rohe $where-String von relation() wird es beim Rendern der Seite mit XcrudConfig::$appSecret HMAC-signiert und bei jeder Anfrage erneut geprüft, sodass ein Besucher es nicht manipulieren kann - es wird jedoch nie gegen das, was Sie schreiben, validiert oder sandboxed - halten Sie es also stets serverseitig verfasst, niemals aus Request-Eingaben zusammengesetzt.
Kaskadierende Dropdowns
$dependField/$dependOn lassen die Optionen eines Relation-Dropdowns basierend auf dem aktuell ausgewählten Wert eines anderen Felds im selben Formular filtern - z. B. ein Stadt-Dropdown, das nur Städte im aktuell ausgewählten Land anbietet. Siehe Kaskadierende / abhängige Dropdowns für die vollständige Anleitung, einschließlich mehrstufiger Ketten.