Laravel
Laravel 11 & 10 • Chapitre 2 : Base de Données

Modèles Eloquent : L'Object-Relational Mapping Puissant

L'ORM Eloquent transforme chaque table de votre base de données en une classe PHP vivante et expressive. Manipulez vos enregistrements comme de véritables objets métier, sans écrire une seule requête SQL complexe à la main.

🔮
Conventions Magiques

Une classe Product cible automatiquement la table plurielle products, avec id en clé primaire.

🛡️
Protection Mass-Assignment

La propriété $fillable filtre strictement les colonnes autorisées lors d'un create() ou update().

💎
Casts Typés (Laravel 11)

Méthode casts(): array pour convertir instantanément les colonnes en types PHP : boolean, decimal:2, hashed.

⚡
Accessors & Scopes

Calculez des attributs virtuels à la volée (ex: prix_ttc) et réutilisez vos filtres fréquents avec scopeActive().

app/Models/Product.php (Syntaxe Moderne Laravel 11 / 10)
// Astuce Artisan : Créez le Modèle + Migration + Factory + Seeder en une seule commande !
// php artisan make:model Product -mfs

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentCastsAttribute;
use IlluminateDatabaseEloquentRelationsBelongsTo;
use IlluminateDatabaseEloquentBuilder;

class Product extends Model
{
    use HasFactory;

    // 1. Protection Mass Assignment : Seules ces colonnes peuvent être injectées
    protected $fillable = [
        'name',
        'slug',
        'description',
        'price',
        'stock',
        'is_active',
        'category_id',
    ];

    // 2. Casts Typés Modernes (Méthode officielle Laravel 11 & PHP 8.2)
    protected function casts(): array
    {
        return [
            'is_active' => 'boolean',
            'price' => 'decimal:2',
            'stock' => 'integer',
            'created_at' => 'datetime',
        ];
    }

    // 3. Accessor Moderne : Attribut virtuel calculé $product->formatted_price
    protected function formattedPrice(): Attribute
    {
        return Attribute::make(
            get: fn () => number_format((float) $this->price, 2, ',', ' ') . ' €'
        );
    }

    // 4. Relation Eloquent : Un produit appartient à une catégorie
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }

    // 5. Local Scope : Réutilisable dans les requêtes -> Product::active()->get()
    public function scopeActive(Builder $query): Builder
    {
        return $query->where('is_active', true)->where('stock', '>', 0);
    }
};

Simulateur Inspecteur Eloquent & Casts Dynamiques

Simulation Modèle Objet

Modifiez les données brutes SQL (chaînes de caractères non typées) pour voir comment le Modèle Eloquent les convertit automatiquement en propriétés PHP typées et calcule les attributs virtuels.

LIGNE BRUTE DANS MYSQL / SQLITEPDO row (string)
// Résultat SQL brut avant hydratation Eloquent :
[
  "id" => "42",
  "name" => "MacBook Pro M3",
  "price" => "1499.99",       // Type: string
  "stock" => "8",       // Type: string
  "is_active" => "1"    // Type: string ("1" ou "0")
]
INSTANCE ÉLOQUENT $product✓ Typé PHP 8 & Casts appliqués
$product->name : "MacBook Pro M3"string
$product->price : 1499.99float (decimal:2)
$product->stock : 8int
$product->is_active : trueboolean

$product->formatted_price (Accessor) : 1 499,99 €
$product->isAvailable() : En stock & actif
Règle d'Or : Toujours utiliser $fillable

Le Mass Assignment survient quand un utilisateur soumet via formulaire un champ inattendu (par exemple is_admin = true ou balance = 9999).

En déclarant expressément la liste blanche protected $fillable = ['name', 'price', ...], Eloquent ignore silencieusement tout champ non autorisé lors de Model::create($request->all()).

Raccourci Artisan Tout-en-Un

Gagnez un temps précieux lors de la conception de vos entités grâce aux drapeaux de la commande make:model :

php artisan make:model Order -mfs

-m génère la migration, -f crée la factory correspondante, et -s génère le seeder de test en un instant !