Как использовать DBAL Doctrine

Как использовать DBAL Doctrine

Note

Эта статья посвящена DBAL Doctrine. Обычно вы будете работать с более высоким уровнем ORM Doctrine, который просто использует DBAL за кулисами, чтобы общаться с базой данных. Чтобы узнать больше о Doctrine ORM, см. "Databases and the Doctrine ORM".

DBAL Doctrine (Слой абстракции базы данных) - это слой абстракции, который находится поверх PDO и предлагает интуитивно понятный и гибкий API для коммуникации с наиболее популярными реляционными базами данных. Другими словами, библиотека DBAL облегчает выполнение запросов и выполняет действия других баз данных.

Tip

Прочитайте официальную Документацию DBAL Doctrine, чтобы узнать все детали и способности библиотеки Doctrine DBAL.

Чтобы начать, сконфигурируйте параметры соединения базы данных:

  • YAML
    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
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <!-- 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
                name="default"
                dbname="Symfony"
                user="root"
                password="null"
                charset="UTF8"
                server-version="5.6"
                driver="pdo_mysql"
            />
        </doctrine:config>
    
    </container>
    
  • PHP
     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 Configuration.

Теперь соединение DBAL Doctrine доступно вам через сервис database_connection:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
use Doctrine\DBAL\Driver\Connection;

class UserController extends Controller
{
    public function indexAction(Connection $conn)
    {
        $users = $conn->fetchAll('SELECT * FROM users');

        // ...
    }
}

Регистрация пользовательских типов отображения

Вы можете зарегистрировать пользовательские типы отображения через конфигурацию Symfony. Они будут добавлены ко всем соединениям, которые уже были сконфигурированы. Чтобы узнать больше информации о пользовательских типах отображения, прочтите раздел документации Doctrine Пользовательские типы отображения section of their documentation.

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    doctrine:
        dbal:
            types:
                custom_first:  AppBundle\Type\CustomFirst
                custom_second: AppBundle\Type\CustomSecond
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- 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>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // app/config/config.php
    use AppBundle\Type\CustomFirst;
    use AppBundle\Type\CustomSecond;
    
    $container->loadFromExtension('doctrine', array(
        'dbal' => array(
            'types' => array(
                'custom_first'  => CustomFirst::class,
                'custom_second' => CustomSecond::class,
            ),
        ),
    ));
    

Регистрация пользовательских типов отображения в SchemaTool

SchemaTool используется для исследования баз данных и сравнения их со схемой. Чтобы выполнить это задание, SchemaTool должен знать, какой тип отображения нужно использовать для каждого типа БД. Регистрация новых возможна через конфигурацию.

Теперь, отобразите тип ENUM (не поддерживаемый DBAL по умолчанию) в типе отображения string:

  • YAML
    1
    2
    3
    4
    5
    # app/config/config.yml
    doctrine:
        dbal:
           mapping_types:
              enum: string
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- 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>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    8
    // app/config/config.php
    $container->loadFromExtension('doctrine', array(
        'dbal' => array(
           'mapping_types' => array(
              'enum'  => 'string',
           ),
        ),
    ));
    

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.