设计实体模型以管理多个双向关系

2022-08-30 23:48:40

我试图从我的模型中找到设计实体之间关系的最佳方法。我会试着清楚地解释它。

想象一下以下教义2实体:

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;
}

我想建立两种一对多的双向学说关系,其中并且是关系的拥有方。和 类都具有以下实体配置:CatDogCatDog

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

如何表示另一边的关系?

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

我想象一个解决方案,其中 并继承一个实体类,因此我可以将 ManyToOne 关系移动到该类中,并将 OneToOne 关系的目标实体放入该类中。但是,如果我有一个新的实体和 :,那么问题就会再次出现,而新的 和类必须与它有关系。CatDogAnimalAnimalAnimalSoundHistoryCatDogCarBoat

不能只是将 a 添加为一对多关系到类,因为 并且不会从它继承。所以我仍然无法在实体中填充我的OneToMany关系。SoundHistoryAnimalCarBoattargetEntityImageHistory

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


答案 1

多对一关系是单向的,因此您无法表示另一侧。

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


答案 2

执行所需操作的最佳方法是使用单独的联接表来表示 、 和 、 之间的关系。为此,您可以将一对多单向映射与联接表结合使用。在这里找到的教义文档,感谢NaeiKinDus:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-unidirectional-with-join-tableCatDogImageHistorySoundHistory

关键是 - 图像和声音历史记录是独立存储的,连接表存储谁拥有哪个.所以教义会得到你的猫的,检查并得到正确的。同样,您只能为狗添加,也可以同时为猫和狗添加。cat_image_historyCatImageHistoryidcat_image_historyImageHistoryimage_history_idSoundHistory

映射可能如下所示:

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

推荐