Дата обновления перевода: 2020-01-19

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

Note

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

Doctrine DBAL (Database Abstraction Layer) - это слой абстракции, который работает поверх PDO и предлагает интуитивно понятный и гибкий API для коммуникации с наиболее популярными реляционными базами данных. Библиотека DBAL позволяет вам писать запросы независимо от ваших моделей ORM, например, для построения отчётов или прямой манипуляции данными.

Tip

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

Для начала установите Doctrine orm Symfony pack:

1
$ composer require symfony/orm-pack

Потом настройте переменную окружения DATABASE_URL в .env:

1
2
3
4
# .env (or override DATABASE_URL in .env.local to avoid committing your changes)

# customize this line!
DATABASE_URL="mysql://db_user:[email protected]:3306/db_name"

Детальнее можно настроить в config/packages/doctrine.yaml - см. Doctrine DBAL Configuration. Удалите ключ orm в этом файле, если вы не хотите использовать Doctrine ORM.

Для получения доступа к соединению DBAL, подключите объект Connection:

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

class UserController extends AbstractController
{
    public function index(Connection $connection)
    {
        $users = $connection->fetchAll('SELECT * FROM users');

        // ...
    }
}

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

Регистрация пользовательских Mapping Types

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

  • 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
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            https://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', [
        'dbal' => [
            'types' => [
                'custom_first'  => CustomFirst::class,
                'custom_second' => CustomSecond::class,
            ],
        ],
    ]);
    

Регистрация пользовательских mapping types в SchemaTool

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

Теперь, приведите тип ENUM (не поддерживаемый DBAL по умолчанию) в string с помощью mapping type:

  • 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
            https://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            https://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', [
        'dbal' => [
            'mapping_types' => [
                'enum'  => 'string',
            ],
        ],
    ]);
    

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