【问题标题】:Doctrine ORM: How to define a 1-n realtionship with a n-n connecting tableDoctrine ORM:如何使用 n-n 连接表定义 1-n 关系
【发布时间】:2011-07-18 19:24:02
【问题描述】:

所以,这有点复杂:我有两张表,比如catsdogs。 它们处于多对多关系(可以称为 friendships 或其他),因此 Doctrine 会自动为我创建一个带有适当字段的表 cats_dogs。 (默认为rowid, cat_id, dog_id。)

现在,假设我有第三张桌子,award,我想在其中奖励其中一个友谊。因此,在这里我需要一个引用cats_dogs 中一行的字段。但是,由于这个表在我的模型之间并不真正存在,(Doctrine 为我处理它)对此最优雅的解决方案是什么?

最后,我想在我的award 模型中创建两个字段,一个cat 和一个dog,他们需要建立友谊。

我正在使用注释驱动程序。

【问题讨论】:

  • 看,这是千篇一律的 ORM 的问题之一——在 SQL 本身中微不足道且非常明显的东西一旦涉及 ORM,就会变得非常困难和混乱。抱歉打扰了,继续。
  • 我想应该可以使用 Doctrine,没有任何肮脏的解决方法......我只是不知道如何。 ;)

标签: doctrine


【解决方案1】:

是什么阻止您手动创建 m:n 表,而不是让教义为您创建?

【讨论】:

    【解决方案2】:

    Doctrine 的目标是从 E/R 模式映射对象,并使访问对象连接更容易。因此,我认为 Doctrine 自动提供的表格cats_dogs 是必要的。它简洁并且达到了它的目的,即它提供了一个猫的所有狗的列表,反之亦然,一个狗的所有猫。

    因此,我可以得出结论,最好创建一个名为Award 的第三个实体(除了CatDog),它提供与Cat 的一对一关系和另一个一对一的关系。与Dog 的一种关系。使其与cats_dogs 表保持一致仅取决于您,默认情况下不是 Doctrine 任务。例如,您可以使用一些级联持久选项。 我相信这是 Doctrine 最有效的解决方案。

    作为最后的评论,考虑到每个表应该映射一个或多个实体之间的特定关系,实际上表cats_dogs代表友谊关系,而表Award将表示奖励关系两个朋友之间的关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 2019-04-15
      • 1970-01-01
      • 2012-12-29
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多