所以我有一个媒体实体,可以从不同的目标实体"事件","类别","页面"等引用。
现在,我的媒体实体中只有多个@ManyToMany关联,如下所示:
/**
* @ORMManyToMany(targetEntity="Event", mappedBy="medias")
*/
private $events;
/**
* @ORMManyToMany(targetEntity="Feature", mappedBy="medias")
*/
private $features;
/**
* @ORMManyToMany(targetEntity="Category", mappedBy="medias")
*/
private $categories;
在目标实体中,我有这样的东西:
/**
* @ORMManyToMany(targetEntity="Media", inversedBy="events")
* @ORMJoinTable(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
这在教义上是否可能,如果是,那么性能呢?
您应该使用类表继承。
应创建超类MediaType
作为Media
实体和最终实体之间的中介:
/**
* @Entity
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="entity_class", type="string")
* @DiscriminatorMap({"event" = "Event", "feature" = "Feature", "category" = "Category"})
*/
class MediaType
{
/**
* @ORMManyToMany(targetEntity="Media", inversedBy="mediaType")
*/
protected $medias;
}
/** @Entity */
class Event extends MediaType
{
// ...
}
/** @Entity */
class Category extends MediaType
{
// ...
}
/** @Entity */
class Feature extends MediaType
{
// ...
}