Les relations entre modèles sont au cœur du travail avec Eloquent, l’ORM de Laravel.
Elles permettent de représenter fidèlement la structure d’une base de données tout en manipulant les données de façon intuitive, à travers des objets.
Pour réussir en développement web, mais aussi en examen ou en entretien technique, il est essentiel de comprendre comment ces relations se définissent et comment elles impactent les performances.
Cette série de QCM se concentre sur les relations les plus courantes, comme les associations un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs, ainsi que sur les bonnes pratiques de chargement des données liées.
Elle aborde aussi les mécanismes avancés qui rendent le code plus propre et plus efficace : préchargement, filtrage sur relations, gestion des tables intermédiaires et synchronisation.
L’objectif est d’aider l’apprenant à raisonner comme un développeur Laravel, avec des réflexes solides et une compréhension claire des enjeux.
Les relations entre modèles sont au cœur du travail avec Eloquent, l’ORM de Laravel.
Elles permettent de représenter fidèlement la structure d’une base de données tout en manipulant les données de façon intuitive, à travers des objets.
Pour réussir en développement web, mais aussi en examen ou en entretien technique, il est essentiel de comprendre comment ces relations se définissent et comment elles impactent les performances.
Cette série de QCM se concentre sur les relations les plus courantes, comme les associations un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs, ainsi que sur les bonnes pratiques de chargement des données liées.
Elle aborde aussi les mécanismes avancés qui rendent le code plus propre et plus efficace : préchargement, filtrage sur relations, gestion des tables intermédiaires et synchronisation.
L’objectif est d’aider l’apprenant à raisonner comme un développeur Laravel, avec des réflexes solides et une compréhension claire des enjeux.
QCM
1
Corrigé
Quelle méthode est utilisée pour définir une relation de type 'Un-à-Un' (One-to-One) dans le modèle parent ?
A. hasOne()
B. belongsTo()
C. hasMany()
D. hasOneThrough()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
La méthode hasOne() indique que le modèle possède exactement une instance liée dans une autre table.
QCM
2
Corrigé
Dans une relation 'Un-à-Plusieurs' (One-to-Many), quelle méthode utilise-t-on dans le modèle enfant pour pointer vers le parent ?
A. hasMany()
B. belongsTo()
C. belongsToMany()
D. associate()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
belongsTo() définit l'inverse de la relation et se place dans le modèle qui détient la clé étrangère.
QCM
3
Corrigé
Pour une relation 'Plusieurs-à-Plusieurs' (Many-to-Many), quelle méthode doit être déclarée dans les deux modèles concernés ?
A. hasMany()
B. manyToMany()
C. belongsTo()
D. belongsToMany()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
Cette méthode permet de lier deux modèles via une table pivot intermédiaire.
QCM
4
Corrigé
Quel est l'objectif principal du 'Eager Loading' dans Laravel ?
A. Charger les données uniquement au moment de l'accès à la propriété.
B. Réduire le nombre de requêtes SQL en utilisant la méthode with().
C. Augmenter la sécurité des jointures SQL.
D. Supprimer automatiquement les relations orphelines.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Le Eager Loading résout le problème des requêtes N+1 en préchargeant les relations en une seule fois.
QCM
5
Corrigé
Quelle méthode permet de charger une relation après que le modèle parent a déjà été récupéré ?
A. with()
B. get()
C. load()
D. attach()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
C
Justification :
La méthode load() effectue un 'Lazy Eager Loading' sur une instance de modèle existante.
QCM
6
Corrigé
Comment nomme-t-on la table intermédiaire utilisée dans une relation Many-to-Many ?
A. Table de jointure
B. Table pivot
C. Table de référence
D. Table esclave
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
La table pivot contient les clés étrangères des deux modèles liés.
QCM
7
Corrigé
Quelle méthode permet d'ajouter une entrée dans une table pivot sans créer de doublon ?
A. attach()
B. save()
C. sync()
D. toggle()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
C
Justification :
sync() remplace les liaisons existantes par celles fournies, évitant ainsi les doublons.
QCM
8
Corrigé
Comment accéder aux colonnes supplémentaires d'une table pivot ?
A. ->withPivot('nom_colonne')
B. ->pivot('nom_colonne')
C. ->select('nom_colonne')
D. ->pivot->nom_colonne
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
Il faut déclarer les colonnes extra lors de la définition de la relation avec withPivot().
QCM
9
Corrigé
Quelle méthode définit une relation où un modèle appartient à plusieurs autres modèles sur une base de type 'morphique' ?
A. hasManyThrough()
B. morphedByMany()
C. morphToMany()
D. morphTo()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
morphTo() permet à un modèle d'appartenir à plus d'un type de modèle sur une seule association.
QCM
10
Corrigé
Dans une relation One-to-Many, comment récupérer uniquement les modèles parents qui possèdent au moins un enfant ?
A. Parent::with('enfants')->get()
B. Parent::has('enfants')->get()
C. Parent::whereHas('enfants')->get()
D. Les réponses 2 et 3 sont valides
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
has() et whereHas() filtrent les résultats en fonction de l'existence de relations.
QCM
11
Corrigé
Quelle méthode permet de détacher tous les enregistrements d'une table pivot ?
A. detach() sans arguments
B. remove()
C. sync([])
D. Les réponses 1 et 3 sont valides
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
Appeler detach() sans ID ou synchroniser un tableau vide vide la table pivot pour ce modèle.
QCM
12
Corrigé
Que fait la méthode 'withCount()' ?
A. Elle compte le nombre total de parents.
B. Elle ajoute un attribut 'relation_count' au résultat sans charger les modèles liés.
C. Elle limite le nombre de relations chargées.
D. Elle vérifie si la table est vide.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
C'est une méthode performante pour obtenir le nombre d'enfants sans alourdir la mémoire.
QCM
13
Corrigé
Quelle méthode est utilisée pour les relations 'Un-à-Plusieurs' à travers un modèle intermédiaire ?
A. hasManyThrough()
B. hasOneThrough()
C. belongsToThrough()
D. via()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
Elle permet d'accéder à des relations distantes (ex: Pays -> Utilisateurs -> Articles).
QCM
14
Corrigé
Par défaut, comment Laravel devine-t-il la clé étrangère d'un modèle 'User' ?
A. ID_USER
B. user_id
C. user_pk
D. fk_user
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
La convention est le nom du modèle en 'snake_case' suivi de '_id'.
QCM
15
Corrigé
Comment peut-on ordonner les résultats d'une relation directement dans la définition du modèle ?
A. En ajoutant ->orderBy() après la méthode de relation.
B. Ce n'est pas possible, il faut le faire dans le contrôleur.
C. En utilisant la propriété $sort.
D. En modifiant la migration.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
Les relations Eloquent retournent des instances de constructeur de requête.
QCM
16
Corrigé
Quelle méthode permet d'ajouter un nouvel enregistrement lié sans spécifier manuellement l'ID du parent ?
A. insert()
B. create() sur la relation
C. save() sur la relation
D. Les réponses 2 et 3 sont valides
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
$parent->enfants()->create($data) lie automatiquement le nouvel enfant au parent.
QCM
17
Corrigé
Que se passe-t-il si vous accédez à une relation sans utiliser 'with()' ou 'load()' ?
A. Laravel génère une erreur.
B. Il utilise le 'Lazy Loading' (une requête SQL par accès).
C. Il retourne null.
D. Il charge toutes les tables de la base de données.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
C'est le comportement par défaut, mais cela peut causer des problèmes de performance.
QCM
18
Corrigé
Quelle méthode de pivot permet d'inverser l'état d'une liaison (ajouter si absent, retirer si présent) ?
A. switch()
B. toggle()
C. syncWithoutDetaching()
D. reverse()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
toggle() est très pratique pour des fonctionnalités comme les 'likes' ou les 'abonnements'.
QCM
19
Corrigé
Dans une relation morphique, quelles colonnes sont nécessaires par défaut sur la table ?
A. id et type
B. nom_id et nom_type
C. morph_id et morph_type
D. L'ID suffit.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Le suffixe '_id' stocke la clé et '_type' stocke le nom de la classe du modèle lié.
QCM
20
Corrigé
Comment charger une relation tout en appliquant un filtre (ex: uniquement les commentaires approuvés) ?
A. Parent::with(['commentaires' => function($q) { $q->where('approuve', true); }])
B. Parent::with('commentaires')->where('approuve', true)
C. Parent::filter('commentaires', 'approuve')
D. Ce n'est pas possible en une seule requête.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
On peut passer un tableau avec une fonction anonyme à with() pour personnaliser le chargement.
QCM
21
Corrigé
Quelle méthode de relation est utilisée pour un profil utilisateur qui n'appartient qu'à un seul compte ?
A. hasOne()
B. belongsTo()
C. hasMany()
D. isLinkedTo()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
hasOne() définit une relation 1:1 du côté de la table qui ne possède pas la clé étrangère.
QCM
22
Corrigé
Laquelle de ces affirmations sur 'syncWithoutDetaching()' est vraie ?
A. Elle supprime toutes les anciennes liaisons.
B. Elle ajoute les nouveaux IDs sans toucher aux liaisons existantes.
C. Elle renomme la table pivot.
D. Elle ne fonctionne que pour les relations One-to-One.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Contrairement à sync(), elle ne détache pas les IDs absents du tableau fourni.
QCM
23
Corrigé
Comment s'appelle le concept où Eloquent met à jour le champ 'updated_at' du parent quand un enfant est modifié ?
A. Parent Update
B. Touching Timestamps
C. Cascade Update
D. Relational Sync
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
On utilise la propriété protected $touches = ['relation'] dans le modèle enfant.
QCM
24
Corrigé
Quelle méthode permet de vérifier si une relation est chargée en mémoire ?
A. isLoaded()
B. relationLoaded()
C. hasLoaded()
D. checkRelation()
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Cela permet d'éviter de redéclencher une requête si les données sont déjà là.
QCM
25
Corrigé
Peut-on définir une relation Many-to-Many qui pointe vers la même table (ex: amis d'un utilisateur) ?
A. Non, il faut deux tables différentes.
B. Oui, c'est une relation réflexive (Self-referencing).
C. Oui, mais seulement avec une DTD.
D. Seulement dans Laravel Pro.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Il suffit de spécifier le nom de la table pivot et les clés étrangères manuellement.
QCM
26
Corrigé
Quelle méthode permet de récupérer le premier enregistrement d'une relation Many-to-Many ?
A. $model->relation->first()
B. $model->relation()->first()
C. Les deux sont identiques en termes de performance.
D. La réponse 2 est plus performante car elle ajoute LIMIT 1 à la requête SQL.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
D
Justification :
Appeler la méthode avec () permet de continuer à construire la requête SQL avant l'exécution.
QCM
27
Corrigé
Comment forcer la suppression des enfants lorsqu'un parent est supprimé via Eloquent ?
A. En utilisant les événements de modèle (deleting) ou les clés étrangères SQL 'ON DELETE CASCADE'.
B. C'est automatique dans Laravel.
C. En mettant $deleteChildren = true.
D. En utilisant la méthode flush().
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
Eloquent ne gère pas les suppressions en cascade automatiquement sans instructions spécifiques.
QCM
28
Corrigé
Que renvoie une relation 'hasMany()' si aucun enfant n'est trouvé ?
A. null
B. Une erreur 404
C. Une collection vide
D. false
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
C
Justification :
Les relations multiples retournent toujours un objet Collection, même s'il ne contient rien.
QCM
29
Corrigé
Quelle méthode permet de charger des relations imbriquées (ex: charger les auteurs des commentaires d'un article) ?
A. with('commentaires.auteur')
B. with('commentaires', 'auteur')
C. with('commentaires->auteur')
D. loadDeep('auteur')
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
A
Justification :
La notation par point permet de traverser les niveaux de relations dans with().
QCM
30
Corrigé
Quelle est la limite de 'whereHas()' sur de très grosses bases de données ?
A. Elle ne fonctionne pas avec MySQL.
B. Elle peut être lente car elle génère souvent une sous-requête 'EXISTS'.
C. Elle ne peut pas filtrer par date.
D. Elle désactive le cache.
Afficher la réponse
Cliquez pour voir la correction
Réponse correcte :
B
Justification :
Pour de très gros volumes, des jointures manuelles (join) peuvent parfois être plus performantes.
Mots & Définitions
Consultez les définitions des termes importants.
Une relation One-to-One relie un enregistrement parent à un seul enregistrement enfant. Elle sert à séparer des informations dans deux tables tout en gardant un lien direct et unique.
Une relation One-to-Many signifie qu’un parent peut posséder plusieurs enfants. C’est un modèle très courant, par exemple un article avec plusieurs commentaires.
Une relation Many-to-Many relie plusieurs enregistrements d’un modèle à plusieurs d’un autre. Elle nécessite une table intermédiaire pour stocker les associations entre les deux côtés.
belongsTo() décrit le côté « enfant » d’une relation, celui qui pointe vers le parent. Elle indique que le modèle courant dépend d’un autre modèle via une clé étrangère.
hasOne() définit une relation où un modèle parent possède un seul modèle lié. Elle est utile quand on veut garder une structure claire, tout en séparant les données dans des tables différentes.
L’Eager Loading consiste à charger les relations en même temps que le modèle principal. L’objectif est d’éviter une multiplication de requêtes et d’améliorer les performances.
Le Lazy Loading charge une relation seulement au moment où on y accède. C’est pratique, mais cela peut provoquer beaucoup de requêtes si l’on parcourt une liste d’éléments liés.
with() permet de demander à Eloquent de précharger certaines relations lors de la récupération des modèles. Elle est particulièrement utile pour limiter le nombre de requêtes SQL.
load() sert à charger une relation après avoir déjà récupéré le modèle principal. C’est une solution simple quand on décide plus tard d’afficher ou d’exploiter des données liées.
La table pivot est la table intermédiaire utilisée pour gérer une relation Many-to-Many. Elle contient au minimum les clés étrangères des deux modèles et peut aussi stocker des informations supplémentaires.
attach() ajoute une liaison entre deux modèles dans une relation Many-to-Many. Elle crée une nouvelle ligne dans la table pivot correspondant à l’association.
sync() synchronise une relation Many-to-Many avec une liste d’identifiants fournie. Elle met à jour la table pivot en ajoutant les liaisons manquantes et en supprimant celles qui ne sont plus présentes.
syncWithoutDetaching() ajoute de nouvelles liaisons dans une relation Many-to-Many sans supprimer les anciennes. C’est utile pour enrichir une relation progressivement sans perdre l’existant.
withCount() ajoute au résultat un compteur lié à une relation, sans charger les modèles associés. Cela permet d’obtenir rapidement un nombre d’éléments liés, tout en restant performant.
whereHas() filtre les modèles en fonction de l’existence de relations répondant à une condition. Sur de gros volumes, cette approche peut devenir coûteuse car elle s’appuie souvent sur des sous-requêtes.
À propos de ce QCM
Les notions évaluées dans ces QCM couvrent la manière dont Eloquent modélise les liens entre données.
Comprendre les relations One-to-One et One-to-Many permet de structurer correctement les modèles et d’accéder facilement aux informations associées.
Dans ce cadre, il est important de distinguer les rôles : le parent « possède » des données liées, tandis que l’enfant « appartient » au parent, généralement via une clé étrangère.
Laravel facilite ces liens par des méthodes dédiées, ce qui rend le code plus expressif et moins sujet aux erreurs.
Les relations Many-to-Many introduisent une couche supplémentaire : la table pivot.
Elle joue un rôle central pour stocker les associations et, souvent, des informations complémentaires.
Savoir ajouter, synchroniser ou inverser des liaisons est essentiel lorsqu’on gère des fonctionnalités comme des tags, des rôles, des abonnements ou des relations sociales.
Un autre thème majeur concerne les performances.
Le Lazy Loading peut sembler pratique, mais il devient rapidement problématique lorsqu’on affiche des listes avec des relations, car il multiplie les requêtes.
À l’inverse, l’Eager Loading permet de précharger les données nécessaires et d’éviter les pièges classiques du “trop de requêtes”.
Les méthodes de comptage et de filtrage sur relations complètent cet ensemble, en offrant des moyens efficaces d’extraire des informations pertinentes sans charger inutilement de données.
En travaillant ces QCM, l’apprenant développe une compréhension structurée d’Eloquent, améliore sa capacité à optimiser ses requêtes et renforce sa préparation pour des cas réels, des projets ou des évaluations.
Conclusion
Maîtriser les relations Eloquent, c’est gagner en clarté, en efficacité et en fiabilité dans ses projets Laravel.
Ces QCM permettent de consolider les bases tout en intégrant des réflexes essentiels, notamment sur la gestion des tables intermédiaires et l’optimisation du chargement des données.
En s’entraînant régulièrement, l’utilisateur affine son raisonnement, identifie plus vite les bonnes méthodes et évite les erreurs fréquentes qui coûtent cher en performance.
Cette progression renforce durablement la compréhension du framework et prépare à des développements plus complexes avec une vraie approche professionnelle.