09/08/2020
ORM
La gestion optimale du tiers de données
A. SIDER
Université de Bejaia
Sommaire
• What is an ORM ?
• Why an ORM ?
• ORM examples en Java, en Php, .Net …
• ORM « Eloquent » de Laravel avec des
exemples
A. SIDER-Université de Bejaia-2020 2
1
09/08/2020
What is ?
• ORM : Object Relation Mapper
– Correspondance objet <-> relation
• Une technique qui permet d’interroger et de
manipuler les données d’une BD en utilisant un
paradigme orienté objet
• Par abus de langage , un ORM est une librairie de
fonctions qui implémente la technique ORM
• Un ORM est une libraire écrite dans le langage de
votre choix et qui encapsule le code nécessaire
pour la manipulation des données
A. SIDER-Université de Bejaia-2020 3
Why…? Un exemple imaginaire
• On suppose qu’on a une classe Book
– On souhaite retrouver tous les livres dont l’auteur
est ‘Linus’
book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = [Link]())
{
book = new Book();
[Link]([Link]('author');
book_list.add(book);
}
A. SIDER-Université de Bejaia-2020 4
2
09/08/2020
Whay…Un exemple imaginaire (2)
• Avec un ORM
book_list = [Link](author="Linus");
• La partie mécanique est prise en charge
automatiquement par la librairie de l’ORM
A. SIDER-Université de Bejaia-2020 5
Why and ORM
• Il permet d’abstraire la partie SGBD, ce qui
permet de changer de SGBD très facilement
• Vous n’avez pas à écrire du code SQL
• Plus sain : l’utilisation des « prepared
statements » ou des transaction se fait avec
un simple appel de méthode objet
• Il nous force à écrire du code en MVC, ce qui
le rend plus clair
A. SIDER-Université de Bejaia-2020 6
3
09/08/2020
Examples of ORMs
• Java: Hibernate, EclipseLink, TopLink…
• PHP: Propel (Symphony) ou Doctrine,
Eloquent (Laravel).
• Python: Django ORM ou SQLAlchemy
• C#: NHibernate ou Entity Framework
A. SIDER-Université de Bejaia-2020 7
Un mot sur JPA
• JPA : Java Persistance API
– Une spécification d’une API pour ORM faisant partie
de Java
– Permet d’utiliser soit un fichier XML soit des
annotations (Java > 6) pour indiquer
• Les entités (et les noms de tables correspondant)
• Les attributs (et les champs qui correspondent)
• Les clés primaires, étrangères, etc.
• Hibernate, EclipseLink et TopLink sont des ORM
Java qui implémente JPA
• Il existe aussi NPA (.Net Persistance API)
A. SIDER-Université de Bejaia-2020 8
4
09/08/2020
Eloquence ORM
• Eloquence est l’ORM de Laravel
• [Link]
• Definir un Modèle :
– Namespace :
Illuminate\Database\Eloquent\Model
– php artisan make:model User crée un fichier
[Link]
– class User extends Model {}
A. SIDER-Université de Bejaia-2020 9
ORM Eloquent
• Par défault le nom de la table est supposé être
users dans le SGBD
• Si on souhaite faire autrement :
class User extends Model {
protected $table = 'my_users’;
}
-Eloquent suppose aussi l’existence d’un champs
applelé « id »
-On peut définir le champs qui sert de clé primaire
avec : primaryKey
A. SIDER-Université de Bejaia-2020 10
5
09/08/2020
Requêtes Select
• Dans un controlleur :
– Retrouver tous les utlisateurs :
• $users = User::all();
– Retrouver un enregistrement en iutlisant la clé
primaire:
• $user = User::find(1); print $user->name;
– Retrouver un modèle par la clé primaire ou génrer
une exception :
• $model = User::findOrFail(1);
• $model = User::where('votes', '>', 100)->firstOrFail();
A. SIDER-Université de Bejaia-2020 11
Requêtes Select (suite)
• Retrouver 10 enregistrement avec une clause
select :
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user) {
var_dump($user->name);
}
A. SIDER-Université de Bejaia-2020 12
6
09/08/2020
Requêtes d’insertion
• Enregistrer un modèle
$user = new User;
$user->name = 'John’;
$user->save();
A. SIDER-Université de Bejaia-2020 13
Création de tuples (insertion)
// Créer un nouveau user dans la base...
$user = User::create(['name' => Jughurta']);
// Chercher le user par ses attributs, ou le créer s’il
n’existe pas...
$user = User::firstOrCreate(['name' => Jughurta']);
// Chercher le user par les attributs, ou instancier
une nouvelle instance...
$user = User::firstOrNew(['name' => Jughurta']);
A. SIDER-Université de Bejaia-2020 14
7
09/08/2020
Mettre à jour (update)
• $user = User::find(1); //find utilse la clé
primaire
$user->email = 'john@[Link]’;
$user->save();
• Mettre à jour un modèle et ses relations (1-n,
n-n, etc.)
$user->push();
• Mettre à jour un ensemble de modèles
$affectedRows = User::where('votes', '>', 100)->update(['status' => 2]);
A. SIDER-Université de Bejaia-2020 15
Supprimer un modèle
• Supprimer par clé :
$user = User::find(1);
$user->delete();
• Supprimer un ensemble de modèles
– $affectedRows = User::where('votes', '>', 100)->delete();
A. SIDER-Université de Bejaia-2020 16
8
09/08/2020
Relations n-aires
• One to One:
class User extends Model {
public function phone() {
return $this->hasOne('App\Phone'); }
}
Ici la méthode User::phone va faire un “select” sur
la table phones du modèle Phone
A. SIDER-Université de Bejaia-2020 17
• Relation one to many
class Post extends Model {
public function comments() {
return $this->hasMany('App\Comment’);
}
}
• Maintenant on peut accéder aux commentaires d’un Post
$comments = Post::find(1)->comments;
• On peut enchaîner des conditions
$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();
A. SIDER-Université de Bejaia-2020 18