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

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

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

Note

Эта статья посвящена DBAL Doctrine. Обычно вы будете работать с более высоким уровнем ORM Doctrine, который просто использует DBAL за кулисами, чтобы общаться с базой данных. Чтобы узнать больше о Doctrine ORM, см. "Базы данных и 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 (или переопределите DATABASE_URL в .env.local чтобы избежать отправки изменений)

# настройте эту строку!
DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/db_name"

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// src/Controller/UserController.php
namespace App\Controller;

use Doctrine\DBAL\Connection;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

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

        // ...
    }
}

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

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

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

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
# config/packages/doctrine.yaml
doctrine:
    dbal:
        types:
            custom_first:  App\Type\CustomFirst
            custom_second: App\Type\CustomSecond

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

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

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

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/packages/doctrine.yaml
doctrine:
    dbal:
        mapping_types:
            enum: string