Php 学说2.1通过外国实体的身份一对一双向关联
我使用的是原则2.1,其中支持通过外部实体的身份(外键作为标识符) 是否可以通过具有双向关系的外部实体进行身份识别?我正在尝试,但在加载数据装置时出现以下错误: [例外情况] SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(Php 学说2.1通过外国实体的身份一对一双向关联,php,doctrine-orm,foreign-keys,Php,Doctrine Orm,Foreign Keys,我使用的是原则2.1,其中支持通过外部实体的身份(外键作为标识符) 是否可以通过具有双向关系的外部实体进行身份识别?我正在尝试,但在加载数据装置时出现以下错误: [例外情况] SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(表用户,约束FK_187; dde86bf396750外键(id)引用地址用户id) 以下是我的实体: /** *@实体 */ 类用户 { /**@Id@Column(type=“integer”)@GeneratedValue*/
表用户,约束FK_187; dde86bf396750
外键(id
)引用地址用户id
)
以下是我的实体:
/**
*@实体
*/
类用户
{
/**@Id@Column(type=“integer”)@GeneratedValue*/
私人$id;
/**@OneToOne(targetEntity=“地址”)*/
私人$地址;
}
/**
*@实体
*/
班级地址
{
/**@Id@OneToOne(targetEntity=“User”)*/
私人用户;
}
如果我从用户中删除引用以解决错误,则错误将消失
我希望能够做到以下几点:
$address = $user->getAddress();
…但我似乎不得不这样做:
$address = $entityManager->find('Address', $user->getId());
是这样吗?有办法做到这一点吗
更新1:
我希望能够从任意一方(双向)设置关系,但这似乎不可能
老实说,我不确定关系的反面的意义是什么,因为“仅对关联的反面所做的更改被忽略”
摘自此处的文档:
重点是什么
从应用程序的角度来看,这样做似乎更有意义:
$user->setAddress($address)代码>
而不是:
$address->setUser($user)代码>
但是,第一种不可能,因为:
让关系变得更和谐
用户
端必须是反向端,因此$User->setAddress($address)代码>仍将被忽略李>
有人能解释一下吗:)
Matthew您的用户实体中定义了地址字段的getter吗
public function getAddress()
{
return $this->address;
}
记住,原则总是返回集合 您的问题与“外键作为标识符”无关,而是与关系的拥有方有关:
在学说中,一种关系可能是双向的,但在这种情况下,这种关系必须有“积极的一面”。这意味着:
- 在“实体部分”:两个实体都有一个相互引用的属性。在您的例子中,User中有$address,address中有$User,您可以使用$User->getAddress()和$address->getUser()
- 在“sql部分”:只有一个表,即拥有方,具有引用另一个表的属性
您可以在非拥有方使用“mappedBy”通知Doctrin拥有方是什么。
在您的情况下,使用外键作为标识符,您没有选择权:拥有方是使用外键的一方。
所以,测试一下:
/**
* @Entity
*/
class User
{
/** @Id @Column(type="integer") @GeneratedValue */
private $id;
/** @OneToOne(targetEntity="Address", mappedBy="user") */
private $address;
}
/**
* @Entity
*/
class Address
{
/** @Id @OneToOne(targetEntity="User", inversedBy="address")) */
private $user;
}
另一个要点是:
在双向关系中,当您设置非拥有方时,条令无法自动更新另一方。所以你必须手动操作。如果您不必在每次创建新用户和地址时都考虑这一点,您可以在setter中自动执行此过程:
// in class User :
public function setAddress($address) {
$address->setUser($this); // <= here it is !!!
$this->address = $address;
return $this;
}
// in class Address :
public function setUser($user) {
$this->user = $user;
return $this;
}
谢谢Max,但这不是问题所在。在用户实体中添加$address字段时,会在用户实体类中为我生成一个getAddress()
方法。但是,对于用户实体上的$address
字段,将FK约束添加到数据库中User
表中的id列中。此FK约束阻止数据加载到数据库中,如下所示$address=new address()$地址->设置用户($user)代码>。我的另一个问题是,该用户引用了地址,而您正在尝试添加另一个地址。
$address = new Addresse();
$address->set...
$user->setAddress($address);