【问题标题】:Symfony one-to-one, unidirectional relationSymfony 一对一、单向关系
【发布时间】:2015-06-16 13:10:06
【问题描述】:

我有两个实体。用户和联系人。用户和联系人具有相同的属性 phone_number。如果存在,我想获取与用户对象的所有联系人。也有可能相同的电话号码存在于联系人表中,但它不存在于用户表中。

以下是联系人实体中的注释:

/**
 * @ORM\OneToOne(targetEntity="Dlabs\ServiceBundle\Entity\User", mappedBy="contact")
 * @ORM\JoinColumn(name="phone", referencedColumnName="phone_number", nullable=true)
 */
private $user;

当我更新架构时,出现以下错误:

[Doctrine\DBAL\DBALException] 执行时发生异常 'ALTER TABLE 联系人添加约束 FK_83DFDFA4444F97DD 外键 (phone) REFERENCES users (phone_number) NOT DEFRRABLE INITIALLY 立即':SQLSTATE [23503]:外键违规:7 错误:插入 或更新表“联系人”违反外键约束 “fk_83dfdfa4444f97dd”详细信息:键(电话)=(+38640775xxx)不是 出现在“用户”表中。

[PDOException] SQLSTATE[23503]:外键违规:7 错误: 在表“contact”上插入或更新违反外键约束 “fk_83dfdfa4444f97dd”详细信息:键(电话)=(+38640775xxx)不是 出现在“用户”表中。

有谁知道我应该以哪种方式更改我的注释,这样才能奏效?谢谢!

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    您无法对注释进行任何更改以使其与您现有的关系一起使用。

    您已在联系人和用户实体之间定义了可以为空的一对一关系。从类的角度来看,这意味着 Contact 的 $user 必须要么指向 User 的实例,要么为 null。从对应表的角度来看,这意味着 contact.phone 必须匹配 user.phone_number 或者为空。

    虽然在 PHP 中松散类型意味着理论上联系人的 $user 可以是用户对象或字符串电话号码,但这不能用原则映射来表示。

    两种可能的选择是:

    1. 不要在 Contact 和 User 之间定义明确的实体关系,而是使用查询将它们链接在一起(您可以将查询放入自定义 ContactRepository)。

    2. 创建第三个实体,PhoneNumber,它映射到一个单独的表。然后 Contact 将与 PhoneNumber ($phone) 建立一对一的关系,PhoneNumber 将与 User (例如 $owner) 建立一对一的关系。那么无论是否有关联的用户,属于联系人的电话号码都可以存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      相关资源
      最近更新 更多