【问题标题】:One-to-many relation ship between 3 entities in Doctrine 2Doctrine 2 中 3 个实体之间的一对多关系
【发布时间】:2011-08-13 14:10:22
【问题描述】:

我有三个实体:用户、办公室和电话号码。用户有很多电话号码,办公室也有很多电话号码。

问题是如何在 Doctrine 2 中表示这些实体关系。

  1. 起初我尝试使用双向的一对多关联 (用户 -> 有很多 -> 电话号码)(办公室 -> 有很多 -> PhoneNumbers),PhoneNumber 有两个映射字段,一个为 User 和另一个办公室。此解决方案不起作用,因为其中之一 映射外键不能为空。

  2. 我的第二种方法是对 PhoneNumber 使用两个实体和一个超类。 PhoneNumber 超类定义了除映射字段外的所有公共字段。实体 UserPhoneNumber 和 OfficePhoneNumber 扩展了 PhoneNumber 实体并指定了 不同的映射字段和不同的表。 (OfficePhoneNumbers 一个表,UserPhoneNumbers 一个表)

    这个解决方案确实有效,但是有 3 个实在是太难看了 类来表示一个简单的实体。

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

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

处理这种关联的最佳方式是什么?

谢谢

【问题讨论】:

  • 我之前已经成功完成了解决方案 1)。您能否详细说明您的空约束?另外,每个数字都是唯一的吗?这也起到了一定的作用,即电话号码可以同时是用户和办公室吗?
  • 我不记得确切的错误消息,因为我将代码重写为 3)。我将再次尝试解决方案 1),并让您知道确切的错误消息。是的,每个号码都是唯一的,用户和办公室不能共享同一个号码。
  • 刚试过。我用 2 个电话号码创建了一个办公室,在尝试获取或删除它后,我收到了这条消息:Notice: Undefined index: office_id in D:\www\App\vendor\doctrine\lib\Doctrine\ORM\Persisters\BasicEntityPersister.php line 1270 office_id is mappedBy 电话字段。
  • 终于成功了。我只是犯了一个愚蠢的错误,我在 mappedBy 属性中指定了连接列名,而不是 Phone 实体的字段。谢谢

标签: doctrine-orm symfony model-associations


【解决方案1】:

我终于解决了与(可能是最好的)解决方案 1) 相关的问题。问题是对 mappedBy 属性的误解,它应该指定实体字段,而不是数据库字段。

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多