我正在尝试在我的数据库中的2个实体之间设置FK。父表与子表具有ManyToOne关系。我无法使用普通的parent_id =>加入这些表格。 id FK由于子表如何由外部进程填充(父节点永远不知道子节点的主ID)。
Doctrine接受如下所示的实体,但是当尝试将FK添加到表中时,Mysql失败并出现以下错误。
ALTER TABLE parent_tbl ADD CONSTRAINT FK_1172A832F85E0677 FOREIGN KEY (username) REFERENCES child_tbl (username);
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`dmname`.`#sql-f16_d8acf`, CONSTRAINT `FK_1172A832F85E0677` FOREIGN KEY (`username`) REFERENCES `child_tbl` (`username`))
class Parent
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Child")
* @ORM\JoinColumn(name="username", referencedColumnName="username", nullable=false)
*/
protected $username;
// ...
}
class Child
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*
* @var integer
*/
protected $id;
/**
* @ORM\Column(type="string", unique=true)
*
* @var string
*/
protected $username;
// ....
}
答案 0 :(得分:2)
来自the Doctrine limitations and known issues:
无法使用指向非主键的连接列 Doctrine会认为这些是主键并使用数据创建延迟加载代理,这可能会导致意外结果。
出于性能原因,Doctrine可以在运行时不验证此设置的正确性,而只能通过Validate Schema命令验证。
因此,如果你运行doctrine:schema:validate
命令,你应该得到类似的东西:
[制图] 失败 - 实体类父映射无效:
*引用的列名称'用户名'必须是目标实体类 Child 的主键列。
我希望您找到一种解决方法,使用主键作为连接列来保持逻辑完整。