MySQL Self Join - Joindre une table à elle-même

La jonction d'une table à elle-même n'est pas une fonctionnalité intégrée, mais elle peut être réalisée simplement en modifiant le code SQL généré par le générateur CRUD.


A propos des tables utilisant une jointure avec elles-mêmes

Certaines tables peuvent parfois utiliser une clé relationnelle pour elles-mêmes.
Par exemple, une table qui contient à la fois des catégories et des sous-catégories (voir l'image ci-dessous).
Dans cet exemple, chaque sous-catégorie est liée à une catégorie parentale.

MySQL self-join structure example
Exemple d'une table MySQL avec une clé relationnelle qui se réfère à elle-même

Comment utiliser les tables auto-jointes avec PHP CRUD Generator

PHP CRUD Generator est capable de comprendre ces jointures particulières de la même manière que les relations habituelles.
Les formulaires générés dans l'Admin utiliseront ces relations sans aucun problème.

D'autre part, la requête SQL utilisée pour récupérer les enregistrements de la liste READ doit être modifiée pour fonctionner correctement.

Voici comment procéder :

  1. Créez votre liste READ à partir du générateur comme d'habitude.
  2. Ouvrez le modèle de classe PHP correspondant à votre table, qui se trouve dans admin/class/crud/[NomTable].php

  3. Dans ce fichier, vous trouverez deux lignes qui construisent la requête SQL de base.

    Avec l'exemple de"catégories" que nous avons donné ci-dessus, cela devrait ressembler à ceci :

    $this->join_query = ' LEFT JOIN `categories` ON `categories`.`parent_category_id`=`categories`.`id`';
    $qry_start = 'SELECT
    `categories`.`id`,
    `categories`.`parent_category_id` AS `categories_parent_category_id`,
    `categories`.`name`
    FROM categories';
  4. Vous devez modifier cette demande en :

    • utilisez un alias pour le nom de la table qui fait référence au champ relationnel.
    • déplacer le LEFT JOIN dans la variable $qry_start.

    Votre code final devrait ressembler à ceci :

    $this->join_query = '';
    $qry_start = 'SELECT
    `categories`.`id`,
    `c2`.`parent_category_id` AS `categories_parent_category_id`,
    `categories`.`name`
    FROM categories
    LEFT JOIN `categories` c2
    ON `categories`.`parent_category_id`=`c2`.`id`';

    Dans cet exemple, c2 est un alias pour la table des catégories.
    Nous l'utilisons avec l'identifiant parent_category_id


    Un très bon tutoriel est disponible ici à propos de MySQL Self Join.

Page principale du tutoriel CRUD PHP