Skip to main content

Qu’est-ce qu’une relation

Les tables d’une base de données sont souvent liées entre elles. Un article de blog a plusieurs commentaires ; une commande est reliée à l’utilisateur qui l’a passée. Eloquent facilite la définition et la manipulation de ces relations. Elles se déclarent comme des méthodes sur les modèles Eloquent.
Cette page prend User, Post, Comment, Tag comme exemples concrets. Ces modèles et leurs tables sont supposés déjà créés.
Principales relations Eloquent :

hasOne (1-1)

hasOne : le modèle possède un seul autre modèle. Par exemple, User a un Profile.

Définir la relation

Ajoutez profile au modèle User.
Eloquent déduit la clé étrangère du nom du modèle parent : ici, il attend une colonne user_id dans la table profiles.

Récupérer la relation

Accédez à la relation comme une propriété.
Accéder à la méthode comme à une propriété déclenche automatiquement une requête et retourne les données. On parle de « propriété dynamique de relation ».

belongsTo (inverse de 1-1)

belongsTo est l’inverse : à définir sur le modèle qui contient la clé étrangère. Profile appartient à User.

Définir la relation

Eloquent utilise le nom de la méthode + _id comme clé étrangère (user_id).

Récupérer la relation

hasMany (1-N)

hasMany est la relation la plus courante : un parent, plusieurs enfants. Par exemple, un Post a plusieurs Comment.

Définir la relation

Eloquent attend une colonne post_id sur comments.

Récupérer la relation

hasMany retourne une Collection.
Vous pouvez ajouter des conditions.

Relation inverse (belongsTo)

Pour remonter d’un commentaire au post, définissez belongsTo dans Comment.

belongsToMany (N-N)

Une relation N-N s’utilise quand chaque côté peut avoir plusieurs relations. Par exemple, Post a plusieurs Tag et Tag appartient à plusieurs Post.

Structure des tables

Une table pivot est nécessaire. Pour Post et Tag, créez post_tag.
Eloquent déduit le nom de la table pivot en combinant les deux noms de modèles par ordre alphabétique (post + tagpost_tag).

Définir la relation

Définissez la relation inverse dans Tag.

Récupérer la relation

Ajouter / retirer

attach ajoute des enregistrements dans la pivot ; detach en retire.
sync remplace toutes les associations : seules les IDs passées restent, les autres sont supprimées de la pivot.

Eager loading

Problème N+1

Accéder à une relation comme propriété déclenche une requête à chaque fois : c’est du « lazy loading ». Dans une boucle, cela provoque le problème N+1.
Avec 100 posts, cela fait 101 requêtes. Grosse perte de performance.

Eager loading avec with()

with() charge la relation en masse : seulement 2 requêtes au total.
Les 2 SQL exécutés :

Charger plusieurs relations

Passez un tableau à with().

Eager loading imbriqué

La notation point permet d’aller plus loin.
Le eager loading est essentiel pour éviter le problème N+1. Prenez l’habitude d’utiliser with() chaque fois que vous accédez à une relation dans une boucle.

Prochaines étapes

Introduction à Eloquent

Revenez sur les opérations CRUD de base d’Eloquent.
Dernière modification le 13 juillet 2026