Doctrine ManyToOne没有主ID密钥

时间:2016-03-07 16:13:16

标签: symfony doctrine-orm doctrine

我正在尝试在我的数据库中的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;

    // ....
}

1 个答案:

答案 0 :(得分:2)

来自the Doctrine limitations and known issues

  

无法使用指向非主键的连接列   Doctrine会认为这些是主键并使用数据创建延迟加载代理,这可能会导致意外结果。
  出于性能原因,Doctrine可以在运行时不验证此设置的正确性,而只能通过Validate Schema命令验证。

因此,如果你运行doctrine:schema:validate命令,你应该得到类似的东西:

  

[制图] 失败 - 实体类映射无效:
  *引用的列名称'用户名'必须是目标实体类 Child 的主键列。

我希望您找到一种解决方法,使用主键作为连接列来保持逻辑完整。