Как подключиться к другой схеме в Symfony с использованием Doctrine?

Как настроить Symfony для работы с несколькими схемами в базе данных PostgreSQL без привязки к конкретной схеме в классе Entity?
  • 5 февраля 2024 г. 16:18
Ответы на вопрос 2
Чтобы подключиться к другой схеме в Symfony, используя Doctrine, вам необходимо сконфигурировать соединение с базой данных, чтобы оно указывало на нужную схему, а также настроить ваши сущности (entities) так, чтобы они не зависели от конкретных схем.

Допустим, у вас уже есть конфигурация соединения с базой данных в вашем `config/packages/doctrine.yaml`. Вы можете добавить еще одно соединение (или менеджер сущностей), которое будет указывать на другую схему в вашей базе данных.

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

```yaml
doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                # конфигурация основного соединения
                driver: 'pdo_pgsql'
                server_version: '13'
                charset: utf8
                url: '%env(resolve:DATABASE_URL)%'
            secondary:
                # конфигурация второго соединения
                driver: 'pdo_pgsql'
                server_version: '13'
                charset: utf8
                url: '%env(resolve:SECONDARY_DATABASE_URL)%'
                schema: 'other_schema' # указываем желаемую схему

    orm:
        default_entity_manager: default
        entity_managers:
            default:
                connection: default
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Main'
                        prefix: 'App\Entity\Main'
                        alias: Main
            secondary:
                connection: secondary
                mappings:
                    Secondary:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Secondary'
                        prefix: 'App\Entity\Secondary'
                        alias: Secondary
```

В примере выше, каждый менеджер сущностей (entity manager) связан с определенным соединением. Сущности относящиеся к разным схемам находятся в разных пространствах имен и директориях.

Для того чтобы ваши сущности не были привязаны к конкретной схеме, не указывайте схему в аннотациях сущностей. Используйте только имя таблицы. Вот пример сущности без указания схемы:

```php
namespace App\Entity\Main;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="table_name")
 */
class SomeEntity
{
    // ...
}
```

При выполнении миграций или обновления схемы, вы можете указать нужный менеджер сущностей:

```bash
php bin/console doctrine:migrations:diff --em=secondary
```

Или для создания схемы:

```bash
php bin/console doctrine:schema:create --em=secondary
```

Опция `--em` позволяет указать имя нужного менеджера сущностей.

Обратите внимание: Если вам нужно работать с разными схемами в одних и тех же запросах, вам придется использовать схему при написании запросов DQL или QueryBuilder. Тем не менее, это не рекомендуется, так как ваш код становится менее портабельным и привязывается к конкретной структуре базы данных.
Можно на уровне пользователя в базе установить параметр search_path , в котором задать список схем.
Похожие вопросы