Как использовать 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.

Чтобы начать, сконфигурируйте переменную окружения DATABASE_URL в .env:

1
2
3
4
# .env

# настройте эту строчку!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name"

Дальше можно конфигурировать в config/packages/doctrine.yaml. Чтобы увидеть весь список опций конфигурации DBAL, или чтобы узнать, как конфигурировать множественные соединения, см. Doctrine DBAL Configuration.

Потом вы сможете получать доступ к соединению DBAL, автомонтируя объект 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');

        // ...
    }
}

Это передаст вам сервис database_connection.

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

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

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

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