Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Black Friday: -25€ dès 75€ sur les livres en ligne, vidéos... avec le code BWEEK25. J'en profite !
  1. Livres et vidéos
  2. Laravel
  3. Eloquent ORM
Extrait - Laravel Un framework efficace pour développer vos applications PHP
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP
2 avis
Revenir à la page d'achat du livre

Eloquent ORM

Object Relational Mapping

1. À propos des modèles

Dans un contexte MVC (modèle-vue-contrôleur), et en particulier en programmation orientée objet, un modèle représente les données et la logique liée à ces données.

Voici quelques exemples de modèles pour un site de type e-commerce :

  • produit

  • commande

  • utilisateur

Avec Laravel, un modèle est représenté par une classe, avec des propriétés et des méthodes. Il est généralement lié à une table en base de données. L’ORM (Object-Relational Mapping) Eloquent permet de créer une correspondance entre les classes PHP et la base de données.

Ainsi, grâce à Eloquent, on pourra créer une classe Product pour représenter un produit, associée à une table products, accéder aux colonnes de la table au travers des propriétés de la classe et bénéficier de méthodes pour charger un produit, enregistrer un produit, lister tous les produits ou encore mettre à jour un produit.

2. Manipuler des objets

Eloquent permet donc de manipuler des objets de manière simple et intuitive, en créant une abstraction au-dessus de la base de données. Ainsi, manipuler des données SQL se fait naturellement en utilisant des objets PHP.

Exemple de manipulation d’un utilisateur...

Construire des modèles

1. Utiliser Artisan

a. Initialisation d’un modèle

La méthode la plus simple pour créer un modèle est d’utiliser Artisan. Pour rappel, Artisan est l’outil mis à disposition par Laravel, qui permet de lancer des commandes depuis un terminal. Pour créer une classe permettant de manipuler les articles du blog de jardinage http://mon-jardin.com, il faudra donc indiquer à Artisan de construire un modèle Article, chaque article étant un nouveau conseil sur le jardinage dans cet exemple. Utilisez pour cela la commande Artisan make:model depuis votre terminal.

Commande Artisan pour créer un modèle Article


php artisan make:model Article
 

Par convention, les modèles commencent tous par une majuscule, étant donné qu’ils sont représentés par des classes et que les classes commencent toutes par une majuscule. Il faudra donc privilégier les noms en notation CamelCase, comme par exemple ArticleJardin, plutôt que article_jardin. De plus, le nom de la classe sera toujours au singulier, ce qui signifie qu’un article sera représenté par Article plutôt que par Articles.

Le modèle créé est ajouté dans le dossier app de l’application Laravel. Il s’agit pour l’instant d’une classe sans méthodes ni propriétés propres qui hérite de la classe Model.

Structure d’une classe Article, fichier app/Article.php


<?php  
  
namespace App;  
  
use Illuminate\Database\Eloquent\Model;  
  
class Article extends Model  
{  
    //  
}
 

En résumé, les modèles sont des classes qui héritent de la classe Model. Ils représentent les entités du site. Ils sont enregistrés dans le dossier app.

b. Modèles et migrations

Un modèle sans table associée est rarement suffisant. En effet, un modèle est fait pour persister en base de données. Les articles du blog mon-jardin.com doivent ainsi être enregistrés pour pouvoir être réaffichés plus tard. Et potentiellement modifiés ou supprimés. Créer une migration permet de décrire la table associée à un modèle.

Il est possible de créer une migration...

Utiliser les modèles

1. Créer et enregistrer une instance de modèle

a. Instancier un modèle

Une fois la classe de modèle générée et la table construite, créer une nouvelle instance d’un modèle se fait simplement à l’aide du mot-clé new sur la classe, comme pour créer n’importe quel autre objet en PHP.

Création de trois instances d’utilisateurs


$user_a = new User;  
$user_a->name = 'Colyne';  
  
$user_b = new User;  
$user_b->name = 'Arthur';  
  
$user_c = new $user;  
$user_c->name = 'Brian';
 

Les instances d’un modèle peuvent être créées n’importe où dans le code : dans une méthode d’un contrôleur, ou directement dans la fonction de rappel d’une route.

Si vous rencontrez une erreur du type « Class ’User’ not found » en tentant d’utiliser un modèle, c’est que vous n’avez probablement pas déclaré l’utilisation de l’espace de noms à l’aide du mot-clé use au début du fichier dans lequel vous rencontrez l’erreur. Dans le cas d’une classe User, la première ligne de votre fichier appelant devrait contenir use App\User;. Pour en savoir plus à propos de l’importation des espaces de nom en PHP, voir ici : http://php.net/manual/fr/language.namespaces.importing.php

b. Enregistrement d’un modèle

Enregistrer un modèle se fait grâce à la fonction save disponible sur toutes les instances de modèles. Le mot-clé new crée une instance en mémoire pour la manipuler en PHP, tandis que la méthode save enregistre cette instance dans la base de données.

Enregistrement de trois instances d’utilisateurs


// Initialisation, définitions de propriétés  
$user_a = new User;  
$user_a->name = 'Colyne';  
  
$user_b = new User;  
$user_b->name = 'Arthur';  
  
$user_c = new $user;  
$user_c->name = 'Brian';  
  
// Enregistrement  
$user_a->save();  
$user_b->save();  
$user_c->save();
 

Lorsqu’un modèle est enregistré, cela signifie qu’il est persisté...

Organiser les modèles

1. Espace de noms par défaut

Par défaut, les modèles sont créés dans le dossier app et ont pour espace de noms App. Cela signifie qu’à chaque fois qu’un fichier a besoin d’utiliser un modèle, il doit importer cet espace de noms. L’import d’un espace de noms se fait avec le mot-clé use et doit être effectué en début de fichier.

Exemple dans un fichier routes/web.php


<?php  
  
use App\User;  
use App\Document;  
  
// Affichage de tous les utilisateurs  
Route::get('users', function () {  
    $users = User::all();  
  
    return view('users', [  
        'users' => $users  
    ]);  
});  
  
// Affichage d'un document  
Route::get('documents/{id}', function ($id) {  
    $document = Document::findOrFail($id);  
  
    return view('document', [  
        'document' => $document  
    ]);  
});
 

2. Choisir un autre espace de noms

Quand une application se développe, de plus en plus de modèles sont créés à la racine du dossier app. Il est tout à fait possible de les laisser à cet endroit, mais généralement...

Les relations

Dans la conception et l’architecture d’une base de données SQL, l’un des points les plus importants à prendre en compte est la notion de relations. Par exemple, voici quelques relations pour une application de base de données documentaire permettant la création de documents et l’ajout de commentaires :

  • Un utilisateur possède des documents.

  • Un document peut avoir différents commentaires.

  • Un commentaire appartient à un utilisateur.

  • Etc.

Les verbes ci-dessus décrivent les relations. En base de données, les relations sont généralement créées à l’aide de clés étrangères dans les tables. Au-delà de simplement définir les règles au niveau du schéma, Eloquent permet de faciliter l’accès en lecture et écriture aux relations entre les objets dans le code PHP.

Il existe trois grands types de relations entre des entités : « 1..1 », « 1..n » et « n..n ».

1. Relations 1..1

La relation 1..1 (one-to-one) correspond comme son nom anglais l’indique à une relation unique entre deux entités. Une entité est généralement représentée par un modèle.

Par exemple, si deux entités Company (société) et Address (adresse) existent, on peut déclarer qu’une société possède une et une seule adresse et qu’une adresse appartient à une et une seule société. Il y a donc une relation de un à un.

Dans la suite de cette section sur les relations 1..1, cet exemple de société lié à une adresse sera gardé et déroulé entièrement, depuis la création des modèles jusqu’à l’utilisation et la sauvegarde d’instances.

a. Création des modèles

Pour commencer, cette contrainte doit être codée en base de données, puis indiquée dans les modèles. Créez d’abord les modèles et leurs migrations associées avec Artisan.

Création des modèles


php artisan make:model Company --migration  
php artisan make:model Address --migration
 

b. Structure des tables

Ensuite, il faut créer les migrations...

Mutation, accesseurs et transformation

1. Accesseurs

Les accesseurs permettent de définir des attributs personnalisés sur les modèles. Ce mécanisme peut être utilisé lorsqu’on souhaite modifier la façon dont une colonne en particulier est affichée, ou lorsqu’on souhaite créer un attribut personnalisé qui n’existe pas dans la table de la base de données.

Par exemple, dans l’espace administration d’un site, on peut vouloir afficher le nom de famille des utilisateurs en majuscules. Si la base de données contient une liste d’utilisateur dont le nom n’est pas toujours en majuscule, il sera possible de forcer la transformation du nom en majuscule dès qu’on y accède depuis le code PHP. Autrement dit, un accesseur permet de traiter différemment le stockage et l’affichage.

Pour définir un accesseur, ajoutez une méthode sur le modèle avec le préfixe get et le suffixe Attribute. Au milieu, placez le nom de la propriété en notation CamelCase. Par exemple, pour créer un accesseur sur un attribut author_name, il faut créer une méthode getAuthorNameAttribute. L’accesseur peut faire référence à une colonne existante (par exemple pour donner une valeur par défaut si la propriété est vide) ou un attribut créé...

Requêtes manuelles

Malgré toutes les facilités offertes par Eloquent et le Query Builder, il peut parfois être préférable, voire nécessaire, d’effectuer des requêtes « brutes » directement en base de données. Pour des raisons d’optimisation, de lisibilité ou encore pour des requêtes spécifiques à un SGBD. Le SQL est un langage évolué qui possède ses défauts et ses qualités, un développeur averti saura en tirer profit au moment adéquat.

Pour faire de telles requêtes, Laravel fournit une classe DB et des méthodes associées pour réaliser la plupart des actions classiques d’une base de données (select, insert, update, delete et statement). Chacune de ces méthodes ajoute quelques facilités propres à son fonctionnement. Par exemple, select retournera un tableau d’objets de type stdClass (qui est la classe par défaut des objets en PHP). Tandis que delete et update retourneront le nombre de lignes affectées par l’action. La méthode statement est la plus générique et permet d’exécuter une commande arbitraire, comme la suppression d’une table par exemple.

Exécution de requêtes « brutes »


$id = 2;  
$result = DB::select('SELECT * FROM users WHERE...