Php 学说2.1通过外国实体的身份一对一双向关联

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*/

我使用的是原则2.1,其中支持通过外部实体的身份(外键作为标识符)

是否可以通过具有双向关系的外部实体进行身份识别?我正在尝试,但在加载数据装置时出现以下错误:

[例外情况]

SQLSTATE[23000]:完整性约束冲突:1452无法添加或更新子行:外键约束失败(
用户
,约束
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);