【问题标题】:Optional ManyToOne association in Symfony/DoctrineSymfony/Doctrine 中可选的多对一关联
【发布时间】:2014-08-28 23:37:01
【问题描述】:

我目前正在处理包含现有数据库的项目的新版本,因此我需要创建实体以尝试最小化数据库更改。我的主要问题是我想在两个实体之间创建一个可选关联,但是我们运行 doctrine:scheme:update 命令,它会抛出下一个错误:

  [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")
 */

我想让这个关联成为可选的,因为这个字段根本不是必需的。

我尝试过使用 nullable 属性,但是阅读 Doctrine 文档时,它的默认值似乎是 true,所以它应该对我有用,但无论出于何种原因它都不起作用。

如果您能就这个问题提供任何建议、代码 sn-p 或任何您能告诉我的信息,我将不胜感激。

提前致谢。

编辑:

我已经检查过这个列有 NULL 属性:

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

【问题讨论】:

  • 您是否确定数据库中的表列具有NULL 属性(而不是NOT NULL)?
  • @jperovic 是的,我在发布问题之前已经先检查过了。你还有别的想法吗?
  • 这是一个很长的镜头,但您是否在外键检查关闭时弄乱了table_b(已删除)中的行?另外,检查列类型是否完全相同(不仅是类型名称,还有长度)
  • 您是否尝试在此处添加 nullable:@ORM\JoinColumn(name="b_id", referencedColumnName="id", nullable=true) ?您是否尝试删除数据库上的关系(不是数据,只是关系索引),然后再次运行 php/console dictionary:schema:update --force
  • @jperovic 嗨,我没有修改 table_b 中的任何数据。问题是有很多 'b_id' 为空的记录,因此它们没有现有 B 记录的有效 id,这就是为什么我想将其设为可选。

标签: php symfony doctrine-orm


【解决方案1】:

而不是运行doctrine:scheme:update 运行doctrine:scheme:update --dump-sql

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

【讨论】:

  • 谢谢@skafandri,这个解决方案会有所帮助,但我想正确设置 A 和 B 之间的关联。让我们看看是否有人找到了解决这个问题的正确方法,但谢谢还是回答吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多