
Introduction à Eloquent ORM et aux migrations
Découvrez Eloquent ORM, le mappeur objet-relationnel de Laravel, et les migrations pour gérer facilement la structure de votre base de données et interagir avec vos données.
Plongée dans la gestion de données avec Eloquent et les migrations
La gestion des données est un aspect central de la plupart des applications web. Laravel simplifie grandement cette tâche grâce à deux de ses composants phares : Eloquent ORM (Object-Relational Mapper) et le système de migrations. Eloquent vous permet d'interagir avec votre base de données en utilisant une syntaxe expressive et orientée objet, éliminant le besoin d'écrire des requêtes SQL complexes manuellement pour les opérations courantes. Les migrations, quant à elles, agissent comme un système de contrôle de version pour votre schéma de base de données, vous permettant de définir, modifier et partager la structure de vos tables de manière collaborative et reproductible. Ce chapitre vous introduira aux concepts fondamentaux de ces deux outils puissants, vous mettant sur la voie pour manipuler efficacement les données dans vos projets Laravel.
Nous commencerons par comprendre ce qu'est un modèle Eloquent et comment il se mappe à une table de base de données. Ensuite, nous explorerons comment créer un modèle et sa migration associée à l'aide d'une simple commande Artisan. Vous apprendrez également à exécuter ces migrations pour construire la structure de votre base de données et, enfin, nous verrons comment effectuer des opérations de base pour récupérer des données avec Eloquent. L'objectif est de vous fournir les connaissances essentielles pour commencer à interagir avec votre base de données de manière fluide et intuitive.
Concept de modèle Eloquent et son lien avec les tables de base de données
Eloquent ORM est l'implémentation par Laravel du patron de conception Active Record. L'idée centrale est que chaque table de votre base de données a un "Modèle" correspondant qui est utilisé pour interagir avec cette table. Les modèles Eloquent vous permettent d'effectuer des opérations CRUD (Create, Read, Update, Delete) sur les données de vos tables, ainsi que de définir des relations entre différentes tables, le tout avec une syntaxe PHP élégante et intuitive.
Par convention, un modèle Eloquent est une classe PHP qui hérite de Illuminate\Database\Eloquent\Model. Le nom de la classe du modèle est généralement la version singulière, en casse Pascal (PascalCase), du nom de la table qu'il représente. Par exemple, si vous avez une table nommée users, votre modèle Eloquent s'appellera User. Laravel est suffisamment intelligent pour déduire le nom de la table à partir du nom du modèle. Si votre table ne suit pas cette convention (par exemple, my_users_table), vous pouvez spécifier manuellement le nom de la table dans votre modèle en définissant une propriété protégée $table :
De même, par convention, Eloquent s'attend à ce que chaque table ait une clé primaire nommée id, qui est un entier auto-incrémenté. Si votre clé primaire a un nom différent ou n'est pas auto-incrémentée, vous pouvez également le spécifier dans votre modèle avec les propriétés $primaryKey et $incrementing respectivement.
Chaque instance d'un modèle Eloquent représente une ligne dans la table correspondante. Vous pouvez donc créer de nouveaux enregistrements, lire des enregistrements existants, les mettre à jour ou les supprimer en manipulant des objets de modèle. Cette abstraction rend le code plus lisible et plus maintenable, car vous travaillez avec des objets PHP plutôt qu'avec des chaînes de requêtes SQL.
Créer un modèle et sa migration avec `php artisan make:model -m`
Laravel, via son interface en ligne de commande Artisan, facilite grandement la création conjointe d'un modèle Eloquent et du fichier de migration correspondant. Une migration est un fichier PHP qui décrit les modifications à apporter à votre schéma de base de données (création de tables, ajout de colonnes, etc.). Utiliser des migrations permet de versionner ces changements, de les partager facilement avec d'autres développeurs et de les appliquer de manière cohérente sur différents environnements.
La commande Artisan pour créer un modèle est php artisan make:model NomDuModele. Pour générer également le fichier de migration associé, il suffit d'ajouter l'option -m (ou --migration) :
php artisan make:model Post -mCette commande effectuera deux actions :
- Elle créera un fichier de modèle nommé
Post.phpdans le répertoireapp/Models/(par défaut). Ce fichier contiendra une classe de base pour votre modèle :
- Elle créera un fichier de migration dans le répertoire
database/migrations/. Le nom du fichier sera horodaté et contiendra une description de l'action, par exemple :YYYY_MM_DD_HHMMSS_create_posts_table.php. Ce fichier contiendra une classe avec deux méthodes :up()etdown().
id(); // Crée une colonne 'id' auto-incrémentée et clé primaire
// Ajoutez ici la définition de vos colonnes
// $table->string('title');
// $table->text('content');
$table->timestamps(); // Crée les colonnes 'created_at' et 'updated_at'
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('posts');
}
};
Dans la méthode up(), vous utiliserez le constructeur de schéma (Schema facade et Blueprint object) pour définir la structure de votre table (colonnes, types, index, etc.). La méthode down() contient la logique pour annuler les opérations effectuées par la méthode up(), généralement en supprimant la table.
Exécuter les migrations pour créer la structure de la base de données
Une fois que vous avez défini la structure de vos tables dans les fichiers de migration (en modifiant la méthode up() comme vu précédemment), l'étape suivante consiste à appliquer ces changements à votre base de données. Laravel fournit une commande Artisan simple pour cela : php artisan migrate.
Avant d'exécuter cette commande, assurez-vous d'avoir correctement configuré votre connexion à la base de données dans le fichier .env de votre projet Laravel. Les variables d'environnement clés sont DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, et DB_PASSWORD.
# Exemple de configuration pour MySQL dans .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ma_base_de_donnees_laravel
DB_USERNAME=mon_utilisateur
DB_PASSWORD=mon_mot_de_passeUne fois la configuration en place, exécutez la commande :
php artisan migrateLaravel va alors parcourir tous les fichiers de migration qui n'ont pas encore été exécutés (il garde une trace des migrations exécutées dans une table spéciale appelée migrations) et exécutera leur méthode up(). Si tout se passe bien, vos tables seront créées dans la base de données avec la structure que vous avez définie.
D'autres commandes utiles liées aux migrations incluent :
php artisan migrate:status: Affiche le statut de chaque migration (exécutée ou non).php artisan migrate:rollback: Annule la dernière "fournée" (batch) de migrations exécutées (exécute la méthodedown()des migrations concernées).php artisan migrate:reset: Annule toutes les migrations de votre application.php artisan migrate:refresh: Annule toutes les migrations puis les réexécute (utile pour reconstruire complètement votre base de données).php artisan migrate:fresh: Supprime toutes les tables de la base de données puis exécute toutes les migrations (plus rapide que refresh si vous ne vous souciez pas d'exécuter les méthodesdown()).
L'utilisation des migrations est une bonne pratique fondamentale en développement Laravel, car elle garantit que la structure de la base de données est cohérente et versionnée avec votre code.
Récupérer des données simples avec Eloquent (par exemple, `Model::all()`, `Model::find()`)
Une fois vos modèles définis et vos tables créées via les migrations, vous pouvez commencer à interagir avec vos données en utilisant Eloquent. Eloquent fournit une API simple et expressive pour récupérer des enregistrements de vos tables. Voici quelques-unes des méthodes les plus courantes pour récupérer des données :
Récupérer tous les enregistrements : La méthode statique all() sur un modèle Eloquent retourne une collection (Illuminate\Database\Eloquent\Collection) de tous les enregistrements de la table associée au modèle.
// Supposons que nous ayons un modèle Post.php
use App\Models\Post;
$posts = Post::all(); // Récupère tous les posts
foreach ($posts as $post) {
echo $post->title; // Accède aux attributs du modèle comme des propriétés d'objet
}
Trouver un enregistrement par sa clé primaire : La méthode statique find() permet de récupérer un seul modèle par sa clé primaire (généralement l'id). Si aucun enregistrement n'est trouvé, elle retourne null.
use App\Models\User;
$user = User::find(1); // Récupère l'utilisateur avec l'ID 1
if ($user) {
echo $user->name;
}
Si vous souhaitez qu'une exception soit levée si le modèle n'est pas trouvé (ce qui peut être utile pour retourner automatiquement une erreur 404 dans un contrôleur), vous pouvez utiliser findOrFail() :
use App\Models\Product;
// Si le produit avec l'ID 99 n'existe pas, une exception ModelNotFoundException sera levée.
$product = Product::findOrFail(99);
Récupérer des enregistrements en utilisant des conditions (Query Builder) : Eloquent s'intègre de manière transparente avec le constructeur de requêtes (Query Builder) de Laravel, vous permettant de construire des requêtes plus complexes. Vous pouvez chaîner des méthodes pour ajouter des conditions, trier les résultats, limiter le nombre d'enregistrements, etc. La méthode get() exécute la requête et retourne une collection de modèles, tandis que first() retourne le premier modèle correspondant.
use App\Models\Order;
// Récupérer toutes les commandes avec un montant supérieur à 100
$highValueOrders = Order::where('amount', '>', 100)->get();
// Récupérer la première commande active, triée par date de création (la plus récente en premier)
$latestActiveOrder = Order::where('status', 'active')
->orderBy('created_at', 'desc')
->first();
// Récupérer une commande par une colonne spécifique
$order = Order::where('order_number', 'ORD-12345')->firstOrFail();
Ces exemples ne font qu effleurer la surface de ce qu'Eloquent peut faire. Il prend en charge des relations complexes, le chargement anticipé (eager loading) pour optimiser les requêtes, les accesseurs et mutateurs pour transformer les attributs, les scopes de requête, et bien plus encore. Cependant, la maîtrise de all(), find(), et des requêtes basiques avec where(), orderBy(), get() et first() constitue une excellente base pour commencer à travailler avec les données dans Laravel.