Доктрина2 таблица фильтров в БД для выполнения миграций

#php #symfony #doctrine

Вопрос:

Я искал, чтобы Доктрина игнорировала все таблицы в БД, за исключением сущностей в моем приложении. Я пытался сделать это с помощью опции schema_filter в конфигурации доктрины, однако у меня есть большое количество схем (я использую PostgreSQL) и таблиц в БД, которые мне не нужно просматривать с помощью приложения. Таким образом, самым простым решением, IMO, было бы игнорировать все таблицы, за исключением папки AppEntityCustom (это общая база данных с другими приложениями / пользователями, которые могут создавать схемы / таблицы).

Кроме того, я использую несколько соединений, и я не знаю, как решить мою проблему с этого момента…

Моя конфигурация/пакеты/доктрина.файл yaml :

 doctrine:
    dbal:
        default_connection: classic
        connections:
            classic:
                url: "%env(resolve:DATABASE_URL)%"
                driver: "pdo_pgsql"
                server_version: "11.5"
                charset: "utf8"
            custom:
                url: "%env(resolve:DATABASE_URL_CUSTOM)%"
                driver: "pdo_pgsql"
                server_version: "11.5"
                charset: "utf8"
                schema_filter: "How to filter all tables in DB except for entities table in AppEntityCustom* ?"
                
    orm:
        default_entity_manager: "classic"
        entity_managers:
            classic:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                connection: "api"
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: "%kernel.project_dir%/src/Entity/Classic"
                        prefix: 'AppEntityClassic'
                        alias: "Classic"
            custom:
                connection: "custom"
                mappings:
                    Main:
                        is_bundle: false
                        type: annotation
                        dir: "%kernel.project_dir%/src/Entity/Custom"
                        prefix: 'AppEntityCustom'
                        alias: "custom"
 

И у меня также есть конфигурационный файл 2 миграции, потому что это было бы здорово для разделения миграции / БД (я не знаю, лучший ли это способ заставить его работать) :

конфигурация/classic_migration.ямл :

 doctrine_migrations:
    migrations_paths:
        'DoctrineMigrationsClassic': '%kernel.project_dir%/migrations/Classic'
    enable_profiler: '%kernel.debug%'
    storage:
        table_storage:
            table_name: 'public.migrations'
    em: classic
 

конфигурация/custom_migration.yaml:

 doctrine_migrations:
    migrations_paths:
        'DoctrineMigrationsCustom': '%kernel.project_dir%/migrations/Custom'
    enable_profiler: '%kernel.debug%'
    storage:
        table_storage:
            table_name: 'public.migrations'
    em: custom
 

Может ли кто-нибудь дать мне какой-нибудь трюк / совет ?

Спасибо.

Комментарии:

1. Прямым способом заставить доктрину игнорировать нежелательные таблицы от одного из менеджеров сущностей было бы создание отдельного подключения пользователя с доступом только к требуемым базам данных и/или таблицам, которыми управляет ORM. Это связано с утверждением, что доктрина ORM используется для сопоставления и предоставления базы данных и таблиц, поскольку разработка схем базы данных и таблиц вне ORM не рекомендуется. Если вручную отправлять собственные запросы к другим таблицам, которые не управляются ORM, вам потребуется отдельное подключение пользователь с доступом для поддержки этих особых случаев.

2. Косвенным способом игнорирования других таблиц, которыми не управляет ORM, является создание таблиц с префиксом для имен таблиц, которыми schema_filter правило может явно управлять. например: schema_filter: '~^(orm_)~' для включения только таблиц, которые начинаются с orm_ , в Интернете есть несколько учебных пособий о том, как реализовать автоматические префиксы имен таблиц в Доктрине.

3. Спасибо за ваш ответ, вот что я сделал. Я не хотел добавлять префиксы ко всем своим таблицам, но если у них нет другого решения, я удовлетворюсь этим методом. Еще раз спасибо.