我使用了doctrine:mapping:convert命令来对使用Doctrine 1构建的现有mysql数据库进行反向工程。原始数据库具有整数键字段,如:
`client_id` int(10) unsigned default NULL,
KEY `FK_activity_client` (`client_id`),
和
`client_id` int(10) unsigned NOT NULL auto_increment,
创建实体后,我得到的代码如下:
/**
* @var \Client
*
* @ORM\ManyToOne(targetEntity="Client")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="client_id", referencedColumnName="client_id")
* })
*/
private $client;
和
/**
* @var integer
*
* @ORM\Column(name="client_id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $clientId;
到目前为止这么好,正是我所期待的。然后我对另一个不相关的实体做了一个小改动,并尝试运行doctrine:schema:update。它对以下字段进行了更改:
ALTER TABLE activity CHANGE client_id client_id INT DEFAULT NULL, ...
和
ALTER TABLE activity ADD CONSTRAINT FK_AC74095A8DB60186 FOREIGN KEY (client_id) REFERENCES client (client_id);
DROP INDEX UN_client ON client;
ALTER TABLE client CHANGE client_id client_id INT AUTO_INCREMENT NOT NULL, ...
这会将活动client_id更改为unsigned int(11)signed,然后尝试创建unsigned int(10)的外键。
我们看到我们的老朋友Error 1005,这是MySQL最友好的错误消息。
现在我知道了几个变通方法,所以我可以使用它,我可以将数据库中的字段调整为Doctrine想要的内容,或者使用以下命令关闭外键检查:
SET foreign_key_checks = 0;
在这种情况下,这些解决方法很好。我的问题是:
有没有办法让Doctrine使用数据库的字段大小和属性,在实体中记住它们,并且在不需要时不要弄乱它们。这在数据库很大并且与其他应用程序共享时非常重要,这些应用程序对这些属性应该具有自己的要求。