17

我正在尝试从我的模型中找到设计实体之间关系的最佳方法。我会尽力解释清楚。

想象一下以下 Doctrine2 实体:

class ImageHistory
{
    /**
     * @var Image
     */
    protected $current;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    protected $old;
}

class Dog
{
    protected $name;

    /**
     * @var ImageHistory
     */
    protected $imageHistory;
}

class Cat
{
    protected $name;

    /**
     * @var ImageHistory
     */
    protected $imageHistory;
}

我想建立两个一对多的双向学说关系,Cat并且Dog是关系的拥有方。Cat和类都有Dog这个实体配置:

manyToOne:
    imageHistory:
        targetEntity: ImageHistory
        joinColumn:
            name: image_history_id
            referencedColumnName: id

如何表示 te 关系的另一方?

oneToMany:
    owner:
        targetEntity: <What can I write here?>
        mappedBy: imageHistory

我想象一个解决方案,其中Cat继承Dog一个Animal实体类,因此我可以将 ManyToOne 关系移动到Animal类中并Animal作为 OneToMany 关系的 targetEntity。但是,如果我有一个新SoundHistory实体和 : CatDog并且新的CarBoat类必须与它有关系,问题就会再次出现。

A 不能只添加SoundHistory作为Animal类的 oneToMany 关系,因为Car并且Boat不会从它继承。所以我仍然无法在实体中填充targetEntity我的 OneToMany 关系。ImageHistory

在这种情况下设计实体模型的最佳方法是什么?

4

2 回答 2

0

多对一关系是单向的,所以你不能代表另一方。

此外,如果您真的想将 Dogs 和 Cats 存储在同一个表中,您应该考虑创建一个超级实体。

于 2018-04-24T06:41:49.233 回答
0

做你需要的最好的方法是使用一个单独的连接表来表示Cat,DogImageHistory,之间的关系SoundHistory。为此,您可以使用连接表的一对多单向映射。感谢 NaeiKinDus,在这里找到了教义文档:https ://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-unidirectional-with-join -桌子

关键是——图像和声音的历史是独立存储的,连接表cat_image_history存储的是Cat哪个ImageHistory。所以 Doctrine 会得到你的猫的id,检查cat_image_history并得到正确ImageHistoryimage_history_id。同样的方式,你可以SoundHistory只为狗或猫和狗添加。

映射可能如下所示:

Cat:
  type: entity
  manyToMany:
    imageHistory:
      targetEntity: ImageHistory
      joinTable:
        name: cat_image_history
        joinColumns:
          cat_id:
            referencedColumnName: id
        inverseJoinColumns:
          image_history_id:
            referencedColumnName: id
            unique: true
于 2022-01-05T19:13:37.197 回答