2014-08-28 105 views
0

我目前正在一个包含现有数据库的项目的新版本中工作,因此我需要创建试图缩小数据库更改的实体。我的主要问题是,我想两个实体之间创建一个可选的关联,但我们我跑学说:方案:更新命令时,它抛出我的下一个错误:在Symfony/Doctrine中可选ManyToOne关联

[Doctrine\DBAL\DBALException] 
An exception occurred while executing 'ALTER TABLE table_A ADD CONSTRAINT 
FK_AAB363B1DD3B1998 FOREIGN KEY (b_id) REFERENCES table_B 
(id)': SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update 
a child row: a foreign key constraint fails (`database`.`#sql-7d0_1881`, CONSTRAINT 
`FK_AAB363B1DD3B1998` FOREIGN KEY (`b_id`) REFERENCES 
`table_B` (`id`)) 


[PDOException] 
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child 
row: a foreign key constraint fails (`database`.`#sql-7d0_1881`, CONSTRAINT 
`FK_AAB363B1DD3B1998` FOREIGN KEY (`b_id`) REFERENCES 
`table_B` (`id`)) 

正如你可以在错误,类见A具有包含实体B上的对象的属性。该关联必须是单向的。

当我宣布这个类型的关联,我使用这个代码:

/** 
* @var B 
* 
* @ORM\ManyToOne(targetEntity="B") 
* @ORM\JoinColumn(name="b_id", referencedColumnName="id") 
*/ 

我要让这种关联可选的,因为不需要进行该领域的。

我试过使用可为空属性,但阅读Doctrine文档,它的默认值似乎是真的,所以它应该为我工作,但由于任何原因它不。

我会很感激任何意见,代码片段或任何你可以告诉我关于这个问题。

问候并感谢您提前。

编辑:

我已经选中该列的NULL属性:

http://i.imgur.com/gGSOqTm.png

+0

您是否确定数据库中的表列具有“NULL”属性(与“NOT NULL”相反)? – 2014-08-28 12:36:13

+0

@jperovic是的,我已经在发布问题之前先检查过。你心里还有别的东西吗? – 2014-08-28 12:40:53

+0

这是一个很长的镜头,但是当外键检查关闭时,你是否在'table_b'中删除了行(已删除)?此外,请检查列类型是否完全相同(不仅仅是类型名称,而且长度也是如此) – 2014-08-28 13:40:03

回答

1

相反的运行doctrine:scheme:update运行doctrine:scheme:update --dump-sql

然后手动运行输出SQL代码,并忽略不相关ALTER TABLE table_A ADD CONSTRAINT commands

+0

谢谢@skafandri,这个解决方案会有所帮助,但我想正确设置A和B之间的关联。让我们看看是否有人找到正确的方法对这个问题,但谢谢你的回答。 – 2014-08-29 10:29:00