如何去使用Doctrine DBAL
这篇文章是关于Doctrine DBAL的。通常,您将使用更高级的Doctrine ORM层来完成工作, 但它内部实际上使用DBAL与数据库通信的。 阅读更多关于Doctrine ORM的信息,请看数据库和Doctrine
这个Doctrine数据库抽象层(DBAL : Doctrine Database Abstraction Layer)是一个构建在PDO之上的抽象层,并且提供了一个直观的并且灵活的API,用于与最流行的关系数据库进行通信。换句话说,DBAL库很容易就可以执行查询和执行其他数据库操作。
阅读官方的Doctrine DBAL文档,了解所有的细节和Doctrine DBAL的能力。
马上开始,配置数据库连接参数:
|
# app/config/config.yml
doctrine:
dbal:
driver: pdo_mysql
dbname: Symfony
user: root
password: null
charset: UTF8
server_version: 5.6 |
1
2
3
4
5
6
7
8
9
10
11
12
|
<!-- app/config/config.xml -->
<doctrine:config>
<doctrine:dbal
name="default"
dbname="Symfony"
user="root"
password="null"
charset="UTF8"
server-version="5.6"
driver="pdo_mysql"
/>
</doctrine:config> |
|
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'driver' => 'pdo_mysql',
'dbname' => 'Symfony',
'user' => 'root',
'password' => null,
'charset' => 'UTF8',
'server_version' => '5.6',
),
)); |
想要完整的 DBAL 配置选项或者学习如何配置多种连接,参见 Doctrine DBAL 配置。
然后,你可以通过访问 database_connection
服务来访问 Doctrine DBAL 连接:
|
class UserController extends Controller
{
public function indexAction()
{
$conn = $this->get('database_connection');
$users = $conn->fetchAll('SELECT * FROM users');
// ...
}
} |
注册自定义的映射类型 ¶
你可以通过Symfony配置来注册自定义映射类型。它们将被添加到所有已配置的连接中。想知道更多关于自定义映射类型的信息,请阅读它们文档的 Doctrine 自定义映射类型部分。
|
# app/config/config.yml
doctrine:
dbal:
types:
custom_first: AppBundle\Type\CustomFirst
custom_second: AppBundle\Type\CustomSecond |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<!-- app/config/config.xml -->
<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>
<doctrine:type name="custom_first" class="AppBundle\Type\CustomFirst" />
<doctrine:type name="custom_second" class="AppBundle\Type\CustomSecond" />
</doctrine:dbal>
</doctrine:config>
</container> |
|
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'types' => array(
'custom_first' => 'AppBundle\Type\CustomFirst',
'custom_second' => 'AppBundle\Type\CustomSecond',
),
),
)); |
在 SchemaTool 中注册自定义映射类型 ¶
SchemaTool 用于检查数据库,来比对schema。为了完成这个任务,需要知道每一个数据库类型需要的映射类型是什么。注册新的,可以通过配置来完成。
现在,将 ENUM 类型(默认情况下不被DBAL支持)映射到 string
映射类型:
|
# app/config/config.yml
doctrine:
dbal:
mapping_types:
enum: string |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!-- app/config/config.xml -->
<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>
<doctrine:mapping-type name="enum">string</doctrine:mapping-type>
</doctrine:dbal>
</doctrine:config>
</container> |
|
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'mapping_types' => array(
'enum' => 'string',
),
),
)); |