Chapitre 5Projet SunuLearn

Les modèles Eloquent — manipuler les données

CRUD avec Eloquent, scopes et attributs

Concepts Théoriques

Eloquent est l'ORM (Object-Relational Mapping) de Laravel. Il transforme chaque table en une classe PHP. Au lieu d'écrire du SQL, vous manipulez des objets :

// SQL :  SELECT * FROM formations WHERE is_published = 1 ORDER BY created_at DESC LIMIT 10
// Eloquent :
Formation::where('is_published', true)->latest()->limit(10)->get();

Le résultat est le même — Eloquent génère le SQL en coulisses. L'avantage : le code est lisible, sécurisé (requêtes préparées automatiques), et portable (fonctionne sur MySQL, PostgreSQL, SQLite).

Un modèle = une table

Convention : le modèle Formation (singulier, PascalCase) correspond à la table formations (pluriel, snake_case). Laravel déduit automatiquement le nom de la table.

Créer un modèle

php artisan make:model Formation

Avec migration, factory et seeder d'un coup :

php artisan make:model Formation -mfs

$fillable — protéger les insertions en masse

Par sécurité, Eloquent interdit par défaut l'assignation de masse (mass assignment). Vous devez explicitement lister les colonnes modifiables :

class Formation extends Model
{
    protected $fillable = [
        'title', 'slug', 'short_description', 'description',
        'category_id', 'level', 'duration', 'chapters_count',
        'image_path', 'is_published', 'is_featured', 'is_free', 'order',
    ];
}

Sans $fillable, Formation::create([...]) déclenche une erreur.

CRUD avec Eloquent

Create :

Formation::create([
    'title' => 'Laravel 12',
    'slug' => 'laravel-12',
    'short_description' => 'Le framework PHP le plus populaire',
    'category_id' => 2,
]);

Read :

Formation::all();                           // Toutes les formations
Formation::find(1);                         // Par id
Formation::where('level', 'debutant')->get(); // Avec condition
Formation::where('slug', 'laravel-12')->first(); // Premier résultat
Formation::findOrFail(99);                  // Exception si pas trouvé → page 404

Update :

$formation = Formation::find(1);
$formation->update(['title' => 'Laravel 12 — Le guide complet']);

Delete :

$formation = Formation::find(1);
$formation->delete();

Scopes — des requêtes réutilisables

class Formation extends Model
{
    public function scopePublished($query)
    {
        return $query->where('is_published', true);
    }

    public function scopeFeatured($query)
    {
        return $query->where('is_featured', true);
    }
}

// Utilisation :
Formation::published()->featured()->get();
// SQL : SELECT * FROM formations WHERE is_published = 1 AND is_featured = 1

Casts — convertir les types automatiquement

protected $casts = [
    'is_published' => 'boolean',
    'is_featured' => 'boolean',
    'is_free' => 'boolean',
];

Sans cast, is_published retourne "1" (string). Avec cast, il retourne true (boolean).