2016-03-07 35 views
1

我想在我的数据库中的2个实体之间设置FK。父表与子表具有ManyToOne关系。我无法使用正常的parent_id => id FK连接这些表,因为子表由外部进程填充(父母从不知道子的主ID)。主要ManyToOne W/O主要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; 

    // .... 
} 

回答

2

the Doctrine limitations and known issues

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

所以,如果你运行doctrine:schema:validate命令,你应该得到的东西,如:

[贴图] 失败 - 实体类家长映射无效:
*所引用列名“用户名”必须是目标实体类的主键列子项

我希望你能找到一个解决办法使用主键联接列,让您的逻辑不变。

+0

谢谢。根据我在文档中读到的内容,我担心这一点。我忘记了'doctrine:schema:validate'命令,你是对的,那正是我得到的错误。我会玩弄使用NativeQuery和RSM来看看我是否可以得到一些工作。否则,我只需单独获取子表。 – lifo

+0

很高兴帮助你,我很惊讶地发现在mysql中确实会产生副作用。 – chalasr