【发布时间】:2011-08-13 14:10:22
【问题描述】:
我有三个实体:用户、办公室和电话号码。用户有很多电话号码,办公室也有很多电话号码。
问题是如何在 Doctrine 2 中表示这些实体关系。
起初我尝试使用双向的一对多关联 (用户 -> 有很多 -> 电话号码)(办公室 -> 有很多 -> PhoneNumbers),PhoneNumber 有两个映射字段,一个为 User 和另一个办公室。此解决方案不起作用,因为其中之一 映射外键不能为空。
-
我的第二种方法是对 PhoneNumber 使用两个实体和一个超类。 PhoneNumber 超类定义了除映射字段外的所有公共字段。实体 UserPhoneNumber 和 OfficePhoneNumber 扩展了 PhoneNumber 实体并指定了 不同的映射字段和不同的表。 (OfficePhoneNumbers 一个表,UserPhoneNumbers 一个表)
这个解决方案确实有效,但是有 3 个实在是太难看了 类来表示一个简单的实体。
-
我的第三种方法是使用单向一对多映射。这将消除 PhoneNumber 实体的映射字段的需要。问题是当我对多对多字段使用级联删除时,它在删除记录时违反了完整性约束。
当我省略级联删除选项时,删除用户或办公室后,电话号码仍保留在数据库中(但映射表中的记录被删除)。
处理这种关联的最佳方式是什么?
谢谢
【问题讨论】:
-
我之前已经成功完成了解决方案 1)。您能否详细说明您的空约束?另外,每个数字都是唯一的吗?这也起到了一定的作用,即电话号码可以同时是用户和办公室吗?
-
我不记得确切的错误消息,因为我将代码重写为 3)。我将再次尝试解决方案 1),并让您知道确切的错误消息。是的,每个号码都是唯一的,用户和办公室不能共享同一个号码。
-
刚试过。我用 2 个电话号码创建了一个办公室,在尝试获取或删除它后,我收到了这条消息:
Notice: Undefined index: office_id in D:\www\App\vendor\doctrine\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 1270office_id is mappedBy 电话字段。 -
终于成功了。我只是犯了一个愚蠢的错误,我在 mappedBy 属性中指定了连接列名,而不是 Phone 实体的字段。谢谢
标签: doctrine-orm symfony model-associations