Я использую Symfony Framework 6.4, и до сих пор у меня были ORM 2.19 и DBAL 3.9 от Doctrine.
Теперь я попробовал обновиться до ORM 3.x и DBAL 4.x, но столкнулся с проблема, которую я не могу решить из-за некоторых нарушений BC, перечисленных здесь для ORM и здесь для DBAL, касающихся удаления эмуляции схемы sqlite.
Ситуация:
Производственная БД (Oracle) не находится под моим контролем и содержит все таблицы в схеме/пространстве имен, назовем ее MY_STUFF.
БД для тестирования/разработки — это sqlite, который не поддерживает пространства имен схем.
Объекты атрибутируются с помощью #[ORM\Table(schema: 'MY_STUFF', name: 'ITEMS_VIEW' )].
В config/packages/doctrine.yaml у меня настроено соединение sqlite для тестовой и среды разработки.
При использовании DBAL4/ORM3 в режиме тестирования и разработки, например, попробуйте вставить INSERT INTO MY_STUFF.ITEMS_VIEW, что не удастся. В старых версиях была эмуляция схемы, которая преобразовывала имя таблицы в MY_STUFF__ITEMS_VIEW и работала нормально.
Так что теперь мне нужно поработать над недостающими Схема поддерживаю сам, но не могу понять, как это сделать. В документации ORM 3 есть пример того, как изменять имена таблиц через прослушиватель, но он такой же, как и в ORM 2, и не работает из-за удаленной функциональности (см. разрывы BC).
< h2>Что я пробовал/идеи:
Создал прослушиватели событий для событий postGenerateSchema и loadClassMetadata и смог получать имена таблиц и схем . К сожалению, я не смог найти способ действительно изменить эту информацию, чтобы удалить имя схемы или объединить ее с именем таблицы.
Была ли идея создать свою собственную подкласс атрибута ORM\Table, но он помечен как окончательный.
Пытался установить схему в #[ORM\Table(schema: ' MY_STUFF', name: 'ITEMS_VIEW')] только в определенной среде, но все значения должны быть постоянными, поэтому в атрибуте не допускается никакая логика.
Я мог бы переключиться на staticphp< /code>, как упоминалось в документации для DoctrineBundle, чтобы добавить логику, но я должен настроить всю сущность через PHP, не имея возможности использовать атрибуты, верно?
Было бы неплохо добавить " имя схемы по умолчанию» на основе подключения, поэтому я мог изменить его для каждой среды, но это кажется невозможным.
Надеюсь, кто-нибудь сталкивался с похожая проблема и есть решение. Вариант 1 кажется наиболее многообещающим.
Я использую Symfony Framework 6.4, и до сих пор у меня были ORM 2.19 и DBAL 3.9 от Doctrine. Теперь я попробовал обновиться до ORM 3.x и DBAL 4.x, но столкнулся с проблема, которую я не могу решить из-за некоторых нарушений BC, перечисленных здесь для ORM и здесь для DBAL, касающихся удаления [b]эмуляции схемы sqlite[/b]. Ситуация: [list] [*]Производственная БД (Oracle) не находится под моим контролем и содержит все таблицы в схеме/пространстве имен, назовем ее MY_STUFF. [*]БД для тестирования/разработки — это sqlite, который не поддерживает пространства имен схем. [*]Объекты атрибутируются с помощью #[ORM\Table(schema: 'MY_STUFF', name: 'ITEMS_VIEW' )]. [*]В config/packages/doctrine.yaml у меня настроено соединение sqlite для тестовой и среды разработки. [*]При использовании DBAL4/ORM3 в режиме тестирования и разработки, например, попробуйте вставить INSERT INTO MY_STUFF.ITEMS_VIEW, что не удастся. В старых версиях была эмуляция схемы, которая преобразовывала имя таблицы в MY_STUFF__ITEMS_VIEW и работала нормально. [/list] Так что теперь мне нужно поработать над недостающими Схема поддерживаю сам, но не могу понять, как это сделать. В документации ORM 3 есть пример того, как изменять имена таблиц через прослушиватель, но он такой же, как и в ORM 2, и не работает из-за удаленной функциональности (см. разрывы BC). < h2>Что я пробовал/идеи: [list] [*]Создал прослушиватели событий для событий postGenerateSchema и loadClassMetadata и смог получать имена таблиц и схем . К сожалению, я не смог найти способ действительно [b]изменить[/b] эту информацию, чтобы удалить имя схемы или объединить ее с именем таблицы. [*]Была ли идея создать свою собственную подкласс атрибута ORM\Table, но он помечен как окончательный. [*]Пытался установить схему в #[ORM\Table(schema: ' MY_STUFF', name: 'ITEMS_VIEW')] только в определенной среде, но все значения должны быть постоянными, поэтому в атрибуте не допускается никакая логика. [*]Я мог бы переключиться на staticphp< /code>, как упоминалось в документации для DoctrineBundle, чтобы добавить логику, но я должен настроить всю сущность через PHP, не имея возможности использовать атрибуты, верно? [*]Было бы неплохо добавить " имя схемы по умолчанию» на основе подключения, поэтому я мог изменить его для каждой среды, но это кажется невозможным. [/list] Надеюсь, кто-нибудь сталкивался с похожая проблема и есть решение. Вариант 1 кажется наиболее многообещающим.