有一个类,数据库中已经有一些数据:
class Me
{
/**
* @Column(name="field",type="string")
*/
$field;
/**
* @Column(name="fieldTwo",type="int")
*/
$fieldTwo;
}
我更改映射中第一个字段的列的名称:field --> some_field
class Me
{
/**
* @Column(name="some_field",type="string")
*/
$field;
/**
* @Column(name="fieldTwo",type="int")
*/
$fieldTwo;
}
发射
doctrine:schema:update
我希望 Doctrine 忘记旧的字段列并创建一个新的 some_field。但是该学说以某种方式理解有必要重命名现有列,而不是忘记旧列并创建一个新列。这不符合我的想法。有没有人遇到过这种行为,是什么原因造成的,如何管理?
PS 我注意到该学说没有在项目文件中创建任何关于映射的数据,开发是代码优先的。
您对类属性进行了剖析。属性不变,注释更新,因此学说更新名称。
Doctrina 查看实体类并将其与当前版本的数据库进行比较,发现差异并作为结果对其进行更新。
顺便说一句,Symfony 有一个 DoctrineMigrationsBundle 包,它允许你存储数据库版本状态。但这是另一个话题,与问题无关。
事实证明,一切都是合法的。在:
调用类方法 Doctrine\DBAL\Schema\Comparator compare(),其中顺序比较所有表的变化:
让我们看看diffTable()代码:
正如我所料,该学说列出了目前不在数据库中的那些列,以及新映射中存在但不在数据库中的列的列表。但进一步在 diffTable 中,之后调用了detectColumnRenamings()方法,其中发生了所有魔术:
他的代码:
如果您阅读了该方法的代码(最好是对它的注释 :)),并且还看到了diffColumn()方法的作用(返回对两个任意列的更改),那么很明显: