我在以下方面遇到了一些问题......我有一张带有电话号码的表格。我想为用户和公司使用同一张表。一个用户也可以有多个电话号码和一个公司。所以我想要一个与两个不同连接表的一对多单向关系。一个将电话号码链接到用户,另一个将电话号码链接到公司。这是遵循此处找到的教义2手册第5.9章的解决方案:(单击)
我的用户实体持有此代码:
/** @ORM\ManyToMany(targetEntity="Application\Entity\PhoneNumber")
* @ORM\JoinTable(name="user_phone_number_linker",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="phone_number_id", referencedColumnName="id")}
* )
*/
protected $phone_numbers;
我使用单向一对多,因为问题是我不能制作双向的,因为如果我返回给用户,我不能为公司使用相同的电话号码实体类。现在一切正常,但是当我删除电话号码时,出现以下错误:执行“DELETE FROM phone_number WHERE id = ?”时发生异常 带参数 {"1":1}:
SQLSTATE [23000]:完整性约束违规:1451 无法删除或更新父行:外键约束失败(database/user_phone_number_linker
,CONSTRAINT user_phone_number_linker_ibfk_11
FOREIGN KEY(phone_number_id
)REFERENCES phone_number
(id
))
如果我在数据库中手动设置 ON DELETE CASCADE 值,它可以正常工作,但这不是使用教义 2 的想法,我认为我应该能够在代码中解决它,而无需转到我的 phpMyAdmin 面板。不知何故,应该在删除时启动从电话号码到连接表的级联,但不要从 phone_number 实体返回对连接表的引用。
希望聪明的人能帮我解决这个问题。
编辑
与此同时,我学到了更多关于 Doctrine2 的知识,回顾我的老问题让我意识到这不是首先将多个电话号码存储在一个表中的正确方法。为了能够将用户电话号码和公司电话号码存储在同一个表中,我应该使用带有鉴别器列的表继承。该列应包含一些用户/公司鉴别器。
由于该列,ORM 学说将“知道”该电话号码实际上是用户还是公司电话号码。我需要根据学说 2 specs 中的单表继承映射原则进行两个不同的实体定义。
一个类UserPhoneNumber
将与另一个类有many-to-one
关系,User
称为与CompanyPhoneNumber
的one-to-many
关系Company
。我不一定需要连接列,user_id
或company_id
列可以在电话号码表中。在User
类Company
中省略关联,在Company
类User
中省略关联(数据库应允许这些列的空值)。
如果我确实使用连接表,它是根据Doctrine2 规范中的一对多单向连接表描述
阅读更多
否则,您还可以在这个精心制作的 Doctrine2 深入网站上阅读更多关于关联和级联问题的信息。