如何去使用Doctrine DBAL

3.4 版本
维护中的版本

这篇文章是关于Doctrine DBAL的。通常,您将使用更高级的Doctrine ORM层来完成工作, 但它内部实际上使用DBAL与数据库通信的。 阅读更多关于Doctrine ORM的信息,请看数据库和Doctrine

这个Doctrine数据库抽象层(DBAL : Doctrine Database Abstraction Layer)是一个构建在PDO之上的抽象层,并且提供了一个直观的并且灵活的API,用于与最流行的关系数据库进行通信。换句话说,DBAL库很容易就可以执行查询和执行其他数据库操作。

阅读官方的Doctrine DBAL文档,了解所有的细节和Doctrine DBAL的能力。

马上开始,配置数据库连接参数:

1
2
3
4
5
6
7
8
9
# 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>
1
2
3
4
5
6
7
8
9
10
11
// 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 连接:

1
2
3
4
5
6
7
8
9
10
class UserController extends Controller
{
    public function indexAction()
    {
        $conn = $this->get('database_connection');
        $users = $conn->fetchAll('SELECT * FROM users');
 
        // ...
    }
}

注册自定义的映射类型 

你可以通过Symfony配置来注册自定义映射类型。它们将被添加到所有已配置的连接中。想知道更多关于自定义映射类型的信息,请阅读它们文档的 Doctrine 自定义映射类型部分。

1
2
3
4
5
6
# 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>
1
2
3
4
5
6
7
8
9
// 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 映射类型:

1
2
3
4
5
# 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>
1
2
3
4
5
6
7
8
// app/config/config.php
$container->loadFromExtension('doctrine', array(
    'dbal' => array(
       'mapping_types' => array(
          'enum'  => 'string',
       ),
    ),
));

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)