Symfony/Doctrine重新排列数据库列

4
当我使用doctrine:schema:update命令行生成表格时,Doctrine(或Symfony?)似乎想要插入一个命令来重新排列我的列,将键放在前面。我想知道能否以及更希望知道在哪里可以禁用环境的这个“功能”,这样当我生成表格时,它们就会按照我输入到orm中的顺序保留下来。
我已经寻找了这个问题,但似乎没有其他人遇到过这个问题,而且我不确定需要修改哪个Doctrine或Symfony的bundle/部分才能使其不想重新排列我的表格。如果您能提供有关bundle中包含此逻辑的具体信息或可以添加以更改它的选项,则将不胜感激,因为我目前无法在文档中找到任何信息。
更新: 我进行了一些调查,并找到了一个类似于我的问题的overflow问题,但不完全相同。在我的情况下,我没有使用新的数据类型,移动的唯一列是我指定为键(主键或外键)的列。它抛出给我的命令看起来非常类似于这个,除了它正在对我的每个键执行此操作。
ALTER TABLE product_price CHANGE price price DECIMAL(10,2) DEFAULT NULL

Doctrine自定义类型总是改变表格

更新2:如请求的那样,附加信息:在.orm.yml格式下运行MySQL。

它想要设置的字段始终是关键字段,并且在我将它们更改回我想要/需要的顺序之后,它会感到有必要每次重新排列列。

我不会更改字段的任何内容;这在初始创建时以及每当我需要运行模式更新时都会发生,而没有更改这些特定字段。


我从来没有见过Doctrine坚持重新排列我的列。您使用的是哪个DBMS和版本?列与属性映射之间是否可能存在一些细节差异,例如如果您更改了精度、可空性或默认值? - Martin Lie
doctrine:schema:update在运行ALTER TABLE语句后是否停止抱怨,还是一遍又一遍地建议相同的SQL语句。你的映射配置是什么(注释或.yml结构)。简而言之:需要更多信息才能理解您的情况。;-) - Martin Lie
在主问题中添加了更多信息,希望现在足够了,如果还需要其他内容,请告诉我需要什么,我会尽力添加。 - Gyhth
2个回答

2

我做了一些调查,我认为你无法控制这个。请参见getColumns() [1] [2]

根据此,顺序是PK、FK和其他列,按此顺序排列。 浏览原始逻辑的页面很困难,所以我可能会错过一些东西,但从我所看到的来看,它不会根据任何配置来决定顺序。

[1](回答时;2013年11月)https://github.com/doctrine/dbal/blob/5ffb052a2e622908c988f79e9a099f5d64f40b34/lib/Doctrine/DBAL/Schema/Table.php#L555

[2](更新行号;2020年6月)https://github.com/doctrine/dbal/blob/2.10.x/lib/Doctrine/DBAL/Schema/Table.php#L595


我不确定那是否是问题所在,因为问题源于Doctrine添加了一个ALTER TABLE <table> CHANGE <column> <columnNameAgain> <datatype> ...,而我在这个类中没有看到任何类似的行。你提供的链接里有没有可能我漏掉了它? - Gyhth
1
你可能想要查看特定于平台的类。它们是 SQL 编译的地方。 - Flosculus
列的顺序与ORM内部不同。它似乎按照我指定的顺序创建它们,然后在添加索引之后,重新排列列,即首先是PK,其次是FK,最后是一般索引。 - Gyhth
它只是硬编码实现这种方式,他们可能没有考虑保持列的顺序很重要,毕竟它是抽象的。你为什么需要它按特定顺序排序? - Flosculus
由于您正在使用Symfony2,因此可以轻松创建命令以重新排序。只需从ContainerAwareCommand获取EntityManager并使用$em->getConnection()即可。使用BEFOREAFTER运行SQL以重新排序列,您可能需要在每次更新模式时执行此操作。 - Flosculus
显示剩余3条评论

1

我认为您应该在生产环境中使用以下方法之一

  • 运行 app/console doctrine:schema:update --dump-sql,并手动运行 SQL
  • 使用 DoctrineMigrationBundle 或类似 Liquibase 的迁移工具

我已经得出了要做其中之一的结论,但我更感兴趣的是一些关于为什么需要这样做的思考/理性因素,以及为什么Doctrine希望首先修改我的数据库布局。希望有另一种方法来设置选项,使其不这样做。不过,我很感激您的建议。 - Gyhth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接