MySQL - Zwei Fremdschlüssel, die auf dieselbe Tabelle zeigen

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.


Über Strukturen mit zwei Verbindungen zu einem einzigen Tisch

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:

MySQL two joins to the same table example
Beispiel für eine MySQL-Tabelle mit zwei Joins zur gleichen Tabelle

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.


Erste Lösung: Ändern Sie die Struktur Ihrer Datenbank

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.

MySQL two joins to two distinct tables
Beispiel für eine MySQL-Tabelle mit zwei Joins zu zwei verschiedenen Tabellen

Zweite Lösung: Bearbeiten Sie die SQL-Abfrage READ list manuell

Lassen Sie uns eine etwas andere Struktur wählen:

MySQL two joins to the same table example 2
MySQL-Tabelle mit zwei Joins auf dieselbe Tabelle - Beispiel 2

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:

  1. Öffnen Sie die Datei admin/class/crud/Projects.php in Ihrem Code-Editor
    (ersetzen Sie Projects durch den Namen Ihrer Tabelle)
  2. Suchen Sie die Abfrage im Code und löschen Sie die Felder und die Verknüpfung, die sich auf die zweite Verknüpfung beziehen.
    Der Join-Teil der Abfrage beginnt mit $this->join_query = ' LEFT JOIN ...' und der Felderteil beginnt mit $qry_start = 'SELECT ...'.
  3. Suchen Sie den Codeteil, in dem die Datensätze registriert werden. Er beginnt mit while (!$db->endOfSeek()) { ...
  4. Entfernen Sie in dieser Schleife die Ergebnisse, die sich auf den zweiten Join beziehen
  5. Fügen Sie nach der Schleife eine neue hinzu, um eine Schleife innerhalb aller Datensätze zu erstellen und die Datensätze aus der zweiten Verknüpfung zu erhalten.
    In unserem Beispiel wäre das:
    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.

PHP CRUD-Tutorial Hauptseite