Das Zeigen von zwei Fremdschlüsseln auf eine einzige Tabelle ist ein Grenzfall. Wenn möglich, ist es besser, Ihre Datenbankstruktur zu ändern. Andernfalls müssen Sie den Code Ihrer READ-Liste bearbeiten.
Die Verwendung von zwei Joins auf dieselbe Tabelle ist in manchen Fällen eine absolut logische Struktur, aber diese Art von Struktur ist in der Praxis oft unpraktisch.
Lassen Sie uns ein einfaches Beispiel nehmen:
Um Datensätze aus der Tabelle Projekte auszuwählen, müssen wir diese Art von Abfrage verwenden:
SELECT
projects.name,
manager.name AS manager_name,
manager.firstname AS manager_firstname,
employee.name AS employee_name,
employee.firstname AS employee_firstname
FROM
projects
LEFT JOIN persons AS manager ON projects.manager_id = manager.id
LEFT JOIN persons AS employee ON projects.employee_id = employee.id
Diese Abfrage verwendet Aliasnamen sowohl für die Felder der Personentabelle als auch für den Namen der Tabelle selbst, da sie zweimal abgefragt wird (einmal für jede Verknüpfung).
Dies ist nicht die richtige Lösung. PHPCG verwendet ein erweitertes Filtersystem, mit dem Sie Datensätze in Ihren Listen suchen und filtern können, aber es unterstützt nicht die Verwendung von Aliasen für Tabellen.
Es gibt zwei alternative Lösungen.
In dem obigen Beispiel fasst die Personentabelle zwei verschiedene Entitäten in derselben Tabelle zusammen: Manager und Mitarbeiter.
Dies ist keine gute Idee. Es ist immer besser, für jeden Datentyp (jede Entität) eine Tabelle zu erstellen.
Lassen Sie uns eine etwas andere Struktur wählen:
In diesem zweiten Fall bezieht sich die Tabelle Projekte auf zwei Mitarbeiter.
Es wäre nicht konsistent, zwei Tabellen für Mitarbeiter zu erstellen, da Mitarbeiter eine eindeutige Entität darstellen.
Die Lösung besteht darin, die PHP-Klasse zu bearbeiten, die die Mitarbeiter erstellt, und die vom Generator generierte Abfrage durch zwei separate Abfragen zu ersetzen.
Und so geht's:
$this->join_query = ' LEFT JOIN ...'
und der Felderteil beginnt mit $qry_start = 'SELECT ...'
.while (!$db->endOfSeek()) { .
..for ($i=0; $i < $this->records_count; $i++) { $qry = 'SELECT `Mitarbeiter`.`id` AS `Mitarbeiter_id`, `Mitarbeiter`.`Name` AS `Mitarbeiter_name` FROM projekte LEFT JOIN `Mitarbeiter` ON `projekte`.`Mitarbeiter2_id`=`Mitarbeiter`.`id` WHERE projekte.id = ' . $this->id[$i] . ' LIMIT 1'; $db = new DB(); $db->query($qry); $db_count = $db->rowCount(); if (!empty($db_count)) { $row = $db->fetch(); $this->employees2_id[] = $row->employees_id . '[|]' . $row->employees_name; } else { $this->employees2_id[] = ''; }
Wenn Sie nach diesen benutzerdefinierten Änderungen am Code später Ihre READ-Liste aus dem Generator neu erstellen müssen, vergessen Sie nicht, dass das Dateivergleichstool zur Verfügung steht:
Liste & Formulare, die angepasst wurden, neu generieren (So verwenden Sie das CRUD Generator Dateivergleichstool)
Natürlich erfordert diese Lösung einige Programmierkenntnisse. Wenn Sie Hilfe benötigen, kontaktieren Sie uns bitte und wir werden unser Bestes tun.
Bauen Sie Ihre Datenbank auf