Les relations Eloquent connectent vos modèles entre eux avec une clarté remarquable. Découvrez comment concevoir des relations 1:N, N:N, et surtout comment éliminer le redouté problème de requêtes N+1 grâce à with().
La relation reine : hasMany() dans Category et sa réciproque belongsTo() dans Product.
Table pivot intermédiaire : belongsToMany() avec méthodes fluides attach(), detach() et sync().
Chargez toutes les entités liées en seulement 2 requêtes SQL au lieu de dizaines de requêtes dans une boucle.
Accédez aux données distantes via un modèle intermédiaire ou associez des commentaires à plusieurs entités.
// 1. Modèle Category.php : Une catégorie a plusieurs produits
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsHasMany;
class Category extends Model
{
public function products(): HasMany
{
return $this->hasMany(Product::class);
}
}
// 2. Modèle Product.php : Un produit appartient à une catégorie et a plusieurs tags
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsBelongsTo;
use IlluminateDatabaseEloquentRelationsBelongsToMany;
class Product extends Model
{
public function category(): BelongsTo
{
return $this->belongsTo(Category::class);
}
public function tags(): BelongsToMany
{
return $this->belongsToMany(Tag::class)->withTimestamps();
}
}
// 3. Contrôleur : Éviter le piège N+1 grâce au chargement préalable (Eager Loading)
// ✅ BONNE PRATIQUE : 2 requêtes SQL au total (optimisé)
$products = Product::with(['category', 'tags'])->latest()->get();
// Gestion de la table pivot Many-to-Many :
$product->tags()->sync([1, 4, 7]); // Associe les tags 1, 4, 7 et retire les autres ! Comparez l'impact spectaculaire entre une boucle naïve sans with() (le fameux problème N+1) et l'utilisation de l'Eager Loading dans Laravel.
| Méthode Eloquent | Type de Cardinalité | Exemple Typique | Clé Étrangère par Défaut |
|---|---|---|---|
hasOne() / belongsTo() | Un à Un (1:1) | User hasOne Profile | user_id sur profiles |
hasMany() / belongsTo() | Un à Plusieurs (1:N) | Category hasMany Product | category_id sur products |
belongsToMany() | Plusieurs à Plusieurs (N:N) | Product belongsToMany Tag | Table pivot product_tag |
hasManyThrough() | 1:N via Modèle Tiers | Country hasMany Post through User | Clés intermédiaires |
morphMany() | Polymorphique (1:N) | Comment morphTo Post/Video | commentable_id, commentable_type |