ORM de base de données et de doctrine
L'une des tâches les plus courantes et les plus difficiles pour toute application consiste à lire et à conserver les informations sur les données de la base de données. Bien que le framework symfony n'intègre aucun composant nécessitant l'utilisation d'une base de données, il est étroitement intégré à une bibliothèque de classes tierce nommée Doctrine. L'objectif principal de Doctrine est de vous fournir un outil puissant qui rend l'interaction avec les bases de données plus facile et plus flexible.
Dans ce chapitre, vous apprendrez à utiliser la doctrine pour fournir une interaction riche avec les bases de données dans les projets Symfony.
Doctrine est complètement découplée de symfony, et son utilisation ou non est facultative. Ce chapitre est entièrement consacré à Doctrine ORM, qui vise à vous permettre de mapper des objets à des bases de données relationnelles (telles que MySQL, PostgreSQL et Microsoft SQL). Si vous préférez utiliser la requête brute de la base de données, c'est très simple, vous pouvez vous référer à l'article Comment utiliser Doctrine DBAL pour une explication.
Vous pouvez également utiliser la bibliothèque de classes Doctrine ODM pour conserver les données dans MongoDB. Reportez-vous à DoctrineMongoDBBundle pour plus d'informations.
Exemple simple : un produit (Product) ¶
Pour comprendre le fonctionnement de la Doctrine, La manière la plus simple est de regarder une application pratique. Dans cette section, vous devez configurer votre base de données, créer un objet Product
, le conserver dans la base de données, puis le récupérer. Product
对象,把它持久化到数据库,再取回它。
配置数据库 ¶
真正开始之前,你需要配置你的数据库连接信息。按照惯例,这部分信息通常配置在 app/config/parameters.yml
文件中:
# app/config/parameters.ymlparameters: database_host: localhost database_name: test_project database_user: root database_password: password # ...
通过 parameters.yml
Configurer la base de données ¶
Avant de commencer, vous devez configurez vos informations de connexion à la base de données. Par convention, cette partie des informations est généralement configurée dans le fichier app/config/parameters.yml
:
# app/config/config.ymldoctrine:
dbal:
driver: pdo_mysql
host: "%database_host%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
parameters.yml
. Lors de la configuration de Doctrine, les paramètres définis dans ce fichier seront référencés par le fichier de configuration principal : version. Vous pouvez également facilement stocker la configuration de la base de données (ou toute information sensible) en dehors du projet, par exemple, tout comme les informations de configuration dans Apache. Reportez-vous à #🎜🎜#Comment définir les paramètres externes du conteneur de service#🎜🎜# pour en savoir plus. #🎜🎜##🎜🎜#Maintenant que Doctrine peut se connecter à votre base de données, la commande suivante peut générer automatiquement une base de données test_project
vide : test_project
数据库:
<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:doctrine="http://symfony.com/schema/dic/doctrine" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> <doctrine:config> <doctrine:dbal driver="pdo_mysql" host="%database_host%" dbname="%database_name%" user="%database_user%" password="%database_password%" /> </doctrine:config></container>
如果你要用SQLite作为数据库,在path选项中设置你的数据库路径:
<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:doctrine="http://symfony.com/schema/dic/doctrine" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> <doctrine:config> <doctrine:dbal charset="utf8mb4"> <doctrine:default-table-option name="charset">utf8mb4</doctrine:default-table-option> <doctrine:default-table-option name="collate">utf8mb4_unicode_ci</doctrine:default-table-option> </doctrine:dbal> </doctrine:config></container>
// app/config/config.php$configuration->loadFromExtension('doctrine', array( 'dbal' => array( 'charset' => 'utf8mb4', 'default_table_options' => array( 'charset' => 'utf8mb4' 'collate' => 'utf8mb4_unicode_ci' ) ),));
# app/config/config.ymldoctrine: dbal: driver: pdo_sqlite path: "%kernel.root_dir%/sqlite.db" charset: UTF8
创建一个Entity类 ¶
假设你正构建一套程序,其中有些产品需要展示。即使不考虑Doctrine或者数据库,你也已经知道你需要一个 Product
对象来呈现这些产品。在你AppBundle的 Entity
<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:doctrine="http://symfony.com/schema/dic/doctrine" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd"> <doctrine:config> <doctrine:dbal driver="pdo_sqlite" path="%kernel.root_dir%/sqlite.db" charset="UTF-8" /> </doctrine:config></container>