1

我在以下方面遇到了一些问题......我有一张带有电话号码的表格。我想为用户和公司使用同一张表。一个用户也可以有多个电话号码和一个公司。所以我想要一个与两个不同连接表的一对多单向关系。一个将电话号码链接到用户,另一个将电话号码链接到公司。这是遵循此处找到的教义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_11FOREIGN KEY(phone_number_id)REFERENCES phone_numberid))

如果我在数据库中手动设置 ON DELETE CASCADE 值,它可以正常工作,但这不是使用教义 2 的想法,我认为我应该能够在代码中解决它,而无需转到我的 phpMyAdmin 面板。不知何故,应该在删除时启动从电话号码到连接表的级联,但不要从 phone_number 实体返回对连接表的引用。

希望聪明的人能帮我解决这个问题。

编辑

与此同时,我学到了更多关于 Doctrine2 的知识,回顾我的老问题让我意识到这不是首先将多个电话号码存储在一个表中的正确方法。为了能够将用户电话号码和公司电话号码存储在同一个表中,我应该使用带有鉴别器列的表继承。该列应包含一些用户/公司鉴别器。

由于该列,ORM 学说将“知道”该电话号码实际上是用户还是公司电话号码。我需要根据学说 2 specs 中的单表继承映射原则进行两个不同的实体定义。

一个类UserPhoneNumber将与另一个类有many-to-one关系,User称为与CompanyPhoneNumberone-to-many关系Company。我不一定需要连接列,user_idcompany_id列可以在电话号码表中。在UserCompany中省略关联,在CompanyUser中省略关联(数据库应允许这些列的空值)。

如果我确实使用连接表,它是根据Doctrine2 规范中的一对多单向连接表描述

阅读更多

否则,您还可以在这个精心制作的 Doctrine2 深入网站上阅读更多关于关联和级联问题的信息。

4

2 回答 2

1

正如你所说,你的关系是单向的。您已经定义了从用户到电话号码的关系。当您删除用户时,级联删除将起作用,它将删除 user_phone_number_linker 中的所有行,因为这是您定义的关系。

如果您想以另一种方式进行操作,则必须创建从 PhoneNumbers 到 Users 的关系。教义需要它为你工作。但是您遇到的问题是该实体由其他两个实体用户和公司共享。

请记住,实体是对象,而不是表。因此,您可以尝试为同一个表创建两个实体,一个名为 PhoneNumberUsers,另一个名为 PhoneNumberCompanies。这样您就可以创建所需的关系来执行级联删除。我没有自己测试过,但我认为它可以工作。

顺便说一句,您可以删除用户实体连接表上的 oncascade 参数。对于用户和角色,我有与您相同的场景,但我没有使用它。我认为只有当你想从一个实体级联到另一个实体时才需要它。我不确定,但这就是我到目前为止所经历的。

于 2013-04-04T19:34:21.327 回答
0

我的不好,电话号码用户关系被认为是多对多关系,所以如果要删除电话号码,我不仅应该删除电话号码本身,而且还必须从用户中明确删除电话号码. 所以在控制器中是这样的:

// Remove the phone number user connection from the database
$user->removePhoneNumber($phone_number);

// Remove the phone number from the database
$em->remove($phone_number);

我只是认为使关系与单向一对多的关系的独特限制足以让教义照顾它。那是不正确的。

于 2013-04-08T16:19:36.233 回答