2011-08-13 108 views
1

我有三个实体:User,Office和PhoneNumber。用户有很多电话号码,办公室也有很多电话号码。Doctrine 2中3个实体之间的一对多关系

的问题是如何在教义代表这些实体的关系2.

  1. 起初,我试图用双向一个一对多的关联 (用户 - >有很多 - > PHONENUMBERS) (Office - >有很多 - > PhoneNumbers),PhoneNumber有两个映射字段,一个用于用户 ,另一个用于Office。由于 之一,映射外键不能为空,所以此解决方案不起作用。

  2. 我的第二种方法是使用PhoneNumber的两个实体和一个超类。 PhoneNumber超类定义了除映射字段以外的所有常用字段。实体UserPhoneNumber和 OfficePhoneNumber扩展PhoneNumber实体并指定 不同的映射字段和不同的表。 (一个用于OfficePhoneNumbers的桌子,另一个用于用户电话号码)

    该解决方案实际上可行,但是用类来表示一个简单的实体是相当丑陋的。

  3. 我的第三种方法是使用单向一对多映射。这将消除PhoneNumber实体映射字段的需要。问题是,当我使用级联移除多对多字段时,删除记录时违反了完整性约束。

    当我省略级联删除选项时,在删除用户或办公室后,PhoneNumber将保留在数据库中(但映射表中的记录已删除)。

处理这种关联的最好方法是什么?

由于

+0

我已经完成解决方案1)成功之前。你能否详细说明你的空限制?另外,每个数字都是唯一的吗?这也起着一部分作用,即电话号码既可以是用户也可以是办公室? – Tjorriemorrie

+0

我不记得确切的错误信息,因为我将我的代码重写为3)。我将再次尝试解决方案1)并让您知道确切的错误消息。是的,每个号码都是唯一的,用户和办公室不能共享相同的号码。 –

+0

刚刚尝试过。我创建了一个有两个电话号码的办公室,在尝试取回或删除它后,我收到了以下消息:'注意:未定义索引:D:\ www \ App \ vendor \ doctrine \ lib \ Doctrine \ ORM \ Persisters \ BasicEntityPersister.php行1270' office_id被映射到Phone的字段。 –

回答

0

我终于解决与所连接的问题(可能是最好的)溶液1)。问题在于对mappedBy属性的误解,它应该指定实体字段,而不是数据库字段。

相关问题