ManyToMany协会拥有不同的TargetEntities

时间:2017-06-30 08:02:42

标签: symfony doctrine-orm

所以我有一个Media实体,可以从不同的目标实体“Event”,“Category”,“Page”等引用。

现在我的Media Entity中只有多个@ManyToMany关联,如下所示:

/**
 * @ORM\ManyToMany(targetEntity="Event", mappedBy="medias")
 */
private $events;

/**
 * @ORM\ManyToMany(targetEntity="Feature", mappedBy="medias")
 */
private $features;

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

在目标实体中我有这样的东西:

/**
 * @ORM\ManyToMany(targetEntity="Media", inversedBy="events")
 * @ORM\JoinTable(name="events_medias")
 */
private $medias;

这导致我的数据库中的许多连接表如下所示:

Table "public.events_medias"
  Column  |  Type   | Modifiers
----------+---------+-----------
 media_id | integer | not null
 event_id | integer | not null

我不是很喜欢这个,它使得数据库真的很庞大和复杂。 我想与一个目标实体的类持久化的表做所有这些关联。像这样:

Table "public.medias_entities"
  Column      |  Type   | Modifiers
--------------+---------+-----------
 media_id     | integer | not null
 entity_id    | integer | not null
 entity_class | string  | not null

这可能与学说有关吗?如果可行,那么表现如何?

1 个答案:

答案 0 :(得分:0)

您应该使用Class Table Inheritance

您应该创建超类MediaType作为Media和最终实体之间的中介:

/**
 * @Entity
 * @InheritanceType("JOINED")
 * @DiscriminatorColumn(name="entity_class", type="string")
 * @DiscriminatorMap({"event" = "Event", "feature" = "Feature", "category" = "Category"})
 */
class MediaType
{
    /**
     * @ORM\ManyToMany(targetEntity="Media", inversedBy="mediaType")
     */
    protected $medias;
}

/** @Entity */
class Event extends MediaType
{
    // ...
}

/** @Entity */
class Category extends MediaType
{
    // ...
}

/** @Entity */
class Feature extends MediaType
{
    // ...
}