学说多对多关系

时间:2016-07-27 16:49:28

标签: symfony doctrine-orm

我有一个"列表"具有一个或多个"类别"的实体。 每个"类别"有零个或多个"字段"。每个" Field"有一个或多个"类别"。 我想添加一个" Value"对于每个" Field"每个"类别" "列表"。

这是现有的关系:

Listing <--1:N--> ListingCategory <--N:1--> Category
Category <--1:N--> CategoryField <--N:1--> Field

这是一个有问题的关系:

Listing <----> Category <----> Field <--X--> Value

以下是学说实体: ...

class Listing
{

    /**
     *
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="listings")
     * @ORM\JoinTable(name="listing_category",
     *      joinColumns={@ORM\JoinColumn(name="listing_id", referencedColumnName="id", onDelete="CASCADE")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")}
     * )
     **/
    private $categories;

...

class Category
{

    /**
     * @ORM\ManyToMany(targetEntity="Listing", mappedBy="categories")
     **/
    private $listings;


    /**
     * @ORM\ManyToMany(targetEntity="Field", mappedBy="categories")
     */
    private $fields;

...

class Field
{
    /**
     * @ORM\ManyToMany(targetEntity="Category", inversedBy="fields")
     * @ORM\JoinTable(name="category_field",
     *      joinColumns={@ORM\JoinColumn(name="field_id", referencedColumnName="id", onDelete="CASCADE")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")}
     * )
     **/
    private $categories;

...

class Value
{

     //What should be the relations?

用例示例:

  • Category1有一个Field1
  • listing1具有Category1和Field1的Value1
  • 清单2具有Field1的Category1和Value2

2 个答案:

答案 0 :(得分:0)

如果每个字段有一个值,每个值有一个字段,则关系将为OneToOne。

如果每个Field可以有多个值,那么关系将是从Field到Value的OneToMany和从Value到Field的ManyToOne。

除此之外,这个设计看起来很可疑,因为Value可能只是Field Entity中的一个变量。

答案 1 :(得分:0)

我找到了一个解决方案:将多对多的关系拆分为&#34;一对多,多对一&#34;与复合键的关系。

Listing <--1:N--> ListingCategory <--N:1--> Category
Category <--1:N--> CategoryField <--N:1--> Field 
CategoryField <--1:N--> Value <--N:1--> ListingCategory