Relations de données parentes en PHP
Supposons que nous soyons confrontés à la tâche de stocker des pères et des fils. Supposons que chaque père ne puisse avoir qu'un seul fils, et le fils à son tour peut aussi avoir un seul fils.
Nous devons trouver comment stocker les données.
La première idée qui peut venir à l'esprit
est de créer deux tables : parents
pour
les pères et sons
pour les fils. Puis de lier
ces tables par un champ quelconque : son_id
ou parent_id
.
Cependant, cette idée n'est pas très bonne - car une même personne peut être à la fois père et fils - et il faudra la stocker dans les deux tables, ce qui est peu pratique, prend plus de place et conduit facilement à des erreurs.
Une meilleure option est de lier la table à
elle-même : créons une table users
, dans
laquelle nous stockerons tous les utilisateurs et pour chacun nous créerons
un champ son_id
, dans lequel sera stocké
l'id
du fils de cette même table :
id | name | son_id |
---|---|---|
1 | user1 | 2 |
2 | user2 | 3 |
3 | user3 | null |
Requêtes
Écrivons maintenant une requête qui récupérera l'utilisateur ainsi que son fils.
Pour commencer, récupérons simplement les utilisateurs :
SELECT
*
FROM
users
Maintenant, joignons à les utilisateurs leurs fils. Nous allons joindre la table à elle-même, donc nous devons effectuer son renommage :
LEFT JOIN users as sons
Maintenant nous pouvons spécifier la liaison entre la table principale et la table renommée :
LEFT JOIN users as sons ON sons.id=users.son_id
Spécifions maintenant les champs :
SELECT
users.name as user_name, sons.name as son_name
Assemblons tout ensemble et nous obtenons la requête suivante :
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Tâches pratiques
Supposons que nous ayons des catégories. Chaque catégorie peut appartenir à une catégorie parente, qui à son tour peut avoir sa propre catégorie parente et ainsi de suite. Décrivez la structure de stockage.
Écrivez une requête qui récupérera une catégorie ainsi que sa catégorie parente.
Écrivez une requête qui récupérera une catégorie ainsi que son parent et son grand-parent.
Écrivez une requête qui récupérera une catégorie ainsi que son parent, son grand-parent et son arrière-grand-parent.