lif*_*ifo 6 doctrine symfony doctrine-orm
我正在尝试在数据库中的两个实体之间设置 FK。父表与子表具有多对一关系。我无法使用正常的parent_id => id FK 连接这些表,因为子表是由外部进程填充的(父表永远不知道子表的主ID)。
Doctrine 接受如下所示的实体,但 Mysql 在尝试将 FK 添加到表时失败,并出现以下错误。
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;
// ....
}
Run Code Online (Sandbox Code Playgroud)
从学说的局限性和已知问题来看:
无法使用指向非主键的连接列。
Doctrine 会认为这些是主键,并使用数据创建延迟加载代理,这可能会导致意外结果。
出于性能原因,Doctrine 不会在运行时验证此设置的正确性,而只能通过 Validate Schema 命令来验证。
因此,如果运行该doctrine:schema:validate命令,您应该得到类似以下内容:
[映射] 失败- 实体类Parent映射无效:
* 引用的列名 'username' 必须是目标实体类Child上的主键列。
我希望您找到一种解决方法,使用主键作为连接列来保持逻辑完整。
| 归档时间: |
|
| 查看次数: |
3092 次 |
| 最近记录: |