Pangkalan Data dan ORM Doktrin
Salah satu tugas yang paling biasa dan mencabar untuk mana-mana aplikasi ialah membaca dan mengekalkan maklumat data daripada pangkalan data. Walaupun rangka kerja symfony tidak menyepadukan mana-mana komponen yang memerlukan penggunaan pangkalan data, ia disepadukan rapat dengan perpustakaan kelas pihak ketiga yang dipanggil Doctrine. Matlamat utama Doctrine adalah untuk menyediakan anda alat berkuasa yang menjadikan interaksi pangkalan data lebih mudah dan lebih fleksibel.
Dalam bab ini, anda akan belajar cara menggunakan doktrin untuk menyediakan interaksi pangkalan data yang kaya dalam projek Symfony.
Doktrin dan simfoni dipisahkan sepenuhnya, dan sama ada untuk menggunakannya atau tidak adalah pilihan. Bab ini adalah mengenai Doktrin ORM, yang bertujuan untuk membolehkan anda memetakan objek ke pangkalan data hubungan (seperti MySQL, PostgreSQL dan Microsoft SQL). Jika anda lebih suka menggunakan pertanyaan mentah pangkalan data, ini sangat mudah, anda boleh rujuk artikel Cara menggunakan Doktrin DBAL.
Anda juga boleh menggunakan perpustakaan kelas Doctrine ODM untuk mengekalkan data ke MongoDB. Rujuk DoctrineMongoDBBundle untuk maklumat lanjut.
Contoh mudah: produk ¶
Untuk memahami cara Doktrin berfungsi, cara paling mudah ialah melihat aplikasi praktikal. Dalam bahagian ini, anda perlu mengkonfigurasi pangkalan data anda, mencipta objek Product
, mengekalkannya ke pangkalan data, dan kemudian mendapatkannya. Product
对象,把它持久化到数据库,再取回它。
配置数据库 ¶
真正开始之前,你需要配置你的数据库连接信息。按照惯例,这部分信息通常配置在 app/config/parameters.yml
文件中:
# app/config/parameters.ymlparameters: database_host: localhost database_name: test_project database_user: root database_password: password # ...
通过 parameters.yml
Mengkonfigurasi pangkalan data ¶
Sebelum anda benar-benar bermula, anda perlu mengkonfigurasi maklumat sambungan pangkalan data anda. Mengikut konvensyen, bahagian maklumat ini biasanya dikonfigurasikan dalam fail 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< /code> , hanya konvensyen. Apabila mengkonfigurasi Doktrin, parameter yang ditakrifkan dalam fail itu akan dirujuk oleh fail konfigurasi utama: 🎜<!-- 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>
// app/config/config.php$configuration->loadFromExtension('doctrine', array(
'dbal' => array(
'driver' => 'pdo_mysql',
'host' => '%database_host%',
'dbname' => '%database_name%',
'user' => '%database_user%',
'password' => '%database_password%',
),));
$ php bin/console doctrine:database:create
🎜 Dengan mengasingkan maklumat pangkalan data ke dalam fail berasingan, anda boleh menyimpan versi berbeza untuk setiap pelayan dengan mudah. Anda juga boleh menyimpan konfigurasi pangkalan data (atau sebarang maklumat sensitif) dengan mudah di luar projek, contohnya, sama seperti maklumat konfigurasi dalam Apache. Rujuk 🎜Cara menetapkan parameter luaran bekas perkhidmatan🎜 untuk mengetahui lebih lanjut. 🎜🎜Kini Doktrin boleh menyambung ke pangkalan data anda, arahan berikut boleh menjana pangkalan data projek_ujian
kosong: test_project
数据库:
$ php bin/console doctrine:database:drop --force
$ php bin/console doctrine:database:create
如果你要用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 driver="pdo_sqlite" path="%kernel.root_dir%/sqlite.db" charset="UTF-8" />
</doctrine:config></container>
// app/config/config.php$container->loadFromExtension('doctrine', array(
'dbal' => array(
'driver' => 'pdo_sqlite',
'path' => '%kernel.root_dir%/sqlite.db',
'charset' => 'UTF-8',
),));
// src/AppBundle/Entity/Product.phpnamespace AppBundle\Entity; class Product{
private $name;
private $price;
private $description;}
创建一个Entity类 ¶
假设你正构建一套程序,其中有些产品需要展示。即使不考虑Doctrine或者数据库,你也已经知道你需要一个 Product
对象来呈现这些产品。在你AppBundle的 Entity
$ php bin/console doctrine:generate:entity