FAQ PHP
FAQ PHPConsultez toutes les FAQ
Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 18 septembre 2021
Il faut télécharger la dernière version des scripts : https://www.doctrine-project.org/
PDO et le driver de votre BDD pour PDO doivent également être activés, et PHP >= 5.1 est nécessaire.
svn co http://doctrine.pengus.net/svn/trunk .
Lien : Comment installer une bibliothèque ?
Lien : Comment installer une extension pour PHP ?
Doctrine permet d'utiliser une base de données sans écrire de requêtes SQL, en utilisant des classes personnalisées.
Il faut mettre les classes personnalisées (dérivées de Doctrine_Record) dans un répertoire, par exemple "/models", ce qui permet à Doctrine de les utiliser pour deviner la structure de la base de données (c'est la persistance).
Chaque classe doit définir sa structure (ses champs) et les relations avec les autres classes. Doctrine s'occupe des relations (JOIN entre tables, clefs étrangères).
Avec Doctrine, il y a deux manières de gérer la persistance des objets vers la BDD : tout un répertoire de classes, ou bien une liste précise de classes.
models
User.php
Message.php
<?php
class
User extends
Doctrine_Record
{
public
function
setTableDefinition()
{
$this
->
hasColumn('name'
,
'string'
,
15
);
$this
->
hasColumn('password'
,
'string'
,
40
);
}
}
?>
<?php
require_once 'classes/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Persistance des classes PHP vers la BDD
Doctrine::
export('models'
);
// Syntaxe alternative :
$db
->
export->
export('models'
);
?>
<?php
require_once 'classes/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Récupérer les requêtes sans les exécuter :
$queries
=
Doctrine::
exportSql('models'
);
// Syntaxe alternative :
$queries
=
$db
->
export->
exportSql('models'
);
?>
<?php
require_once 'classes/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Inclure tous les modèles un à un
require_once 'models/User.php'
;
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Persistance des classes PHP vers la BDD
$db
->
export->
exportClasses(array
('User'
));
?>
<?php
require_once 'classes/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Inclure tous les modèles un à un
require_once 'models/User.php'
;
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Récupérer les requêtes sans les exécuter :
$queries
=
$db
->
export->
exportClassesSql(array
('User'
));
?>
C'est le travail de la méthode Doctrine_Record::save(), il faut donc utiliser une classe dérivée de Doctrine_Record.
Prenons l'exemple d'une table "user" :
<?php
class
User extends
Doctrine_Record
{
public
function
setTableDefinition()
{
$this
->
hasColumn('name'
,
'string'
,
15
);
$this
->
hasColumn('password'
,
'string'
,
40
);
}
}
?>
<?php
// Inclure les classes nécessaires
require_once 'doctrine/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Persistance des classes vers la BDD
Doctrine::
export('models'
);
// Créer un utilisateur
$user
=
new
User();
$user
->
name =
'Yogui'
;
$user
->
password =
strval(sha1('1234'
));
$user
->
save();
// Créer un autre utilisateur
$user
=
new
User();
$user
->
name =
'BrYs'
;
$user
->
password =
strval(sha1('4321'
));
$user
->
save();
?>
Admettons les tables "user" et "message". Nous allons ajouter deux utilisateurs, ainsi qu'un message au premier utilisateur :
<?php
class
User extends
Doctrine_Record
{
public
function
setTableDefinition()
{
// set 'user' table columns, note that
// id column is always auto-created
$this
->
hasColumn('name'
,
'string'
,
15
);
$this
->
hasColumn('password'
,
'string'
,
40
);
}
public
function
setUp()
{
$this
->
hasMany
(
'Message as messages'
,
array
(
'local'
=>
'id'
,
'foreign'
=>
'user_id'
)
);
}
}
?>
<?php
class
Message extends
Doctrine_Record
{
public
function
setTableDefinition()
{
// set 'user' table columns, note that
// id column is always auto-created
$this
->
hasColumn('title'
,
'string'
,
50
);
$this
->
hasColumn('text'
,
'string'
,
1000
);
$this
->
hasColumn('user_id'
,
'integer'
);
}
public
function
setUp()
{
$this
->
hasOne
(
'User'
,
array
(
'local'
=>
'user_id'
,
'foreign'
=>
'id'
,
'onDelete'
=>
'CASCADE'
)
);
}
}
?>
<?php
// Inclure les classes nécessaires
require_once 'doctrine/Doctrine.php'
;
spl_autoload_register(array
('Doctrine'
,
'autoload'
));
// Créer la connexion à la BDD
$pdo
=
new
PDO('mysql:host=localhost;dbname=developpez'
,
'Yogui'
,
'motdepasse'
);
$db
=
Doctrine_Manager::
connection($pdo
);
// Exporter les classes PHP en tant que tables vers la BDD
Doctrine::
export('models'
);
$user
=
new
User();
$user
->
name =
'Yogui'
;
$user
->
password =
strval(sha1('1234'
));
$user
->
messages[
0
]->
title =
'test'
;
$user
->
messages[
0
]->
text =
'Message de test'
;
$user
->
save();
$user
=
new
User();
$user
->
name =
'BrYs'
;
$user
->
password =
strval(sha1('4321'
));
$user
->
save();
?>
Supposant que Doctrine est prêt à être utilisé (partout dans symfony dès que le plug-in est chargé, après l'inclusion de son en-tête sinon), des modèles créés, etc., vous pouvez utiliser ce code pour effectuer une requête SELECT simple sur une table dont vous avez le modèle :
$q
=
Doctrine_Query::
create()
->
from('
table t
'
)
->
select('
t.*
'
);
La partie from permet de sélectionner la table à partir de laquelle la requête sera exécutée ainsi qu'un alias, pour simplifier les écritures suivantes. Le select définit l'opération à effectuer sur la table : ici, sélectionner toutes les colonnes de tous les enregistrements.
Dans la partie from, notez que Doctrine utilise exclusivement des objets ! Le langage DQL de requêtes pour Doctrine ne permet pas d'utiliser directement les tables dans la base de données, il doit passer par les objets créés, par les modèles.
Maintenant, vous voudrez probablement ne sélectionner qu'une partie des enregistrements :
$q
=
Doctrine_Query::
create()
->
from('
table t
'
)
->
select('
t.*
'
)
->
where('
t.id = ?
'
,
$id
);
La clause where ici ajoutée fonctionne exactement comme en SQL. Remarquez l'utilisation des requêtes préparées, il s'agit d'une technique très simple évitant une bonne partie des injections SQL et autres en base de données, étant donné que le point d'interrogation sera remplacé par la valeur après vérification sécuritaire.
Maintenant, pour récupérer les données, deux manières de procéder : soit vous récupérez une liste d'objet dans laquelle vous pourrez itérer à l'aide d'un foreach, soit un objet seul.
Pour une collection d'objets :
$res
=
$q
->
execute
();
foreach($res
as $r
)
{
// faites quelque chose de l'enregistrement $r ici
}
Pour un seul enregistrement :
$r
=
$q
->
fetchOne();
// faites quelque chose de l'enregistrement $r ici