Symfony 具有不同目标实体的许多关联

Symfony 具有不同目标实体的许多关联,symfony,doctrine-orm,Symfony,Doctrine Orm,因此,我有一个媒体实体,它可以从不同的目标实体“事件”、“类别”、“页面”中引用 现在我的媒体实体中有多个@manytomy关联,如下所示: /** * @ORM\ManyToMany(targetEntity="Event", mappedBy="medias") */ private $events; /** * @ORM\ManyToMany(targetEntity="Feature", mappedBy="medias") */ private $features; /**

因此,我有一个媒体实体,它可以从不同的目标实体“事件”、“类别”、“页面”中引用

现在我的媒体实体中有多个@manytomy关联,如下所示:

/**
 * @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
在目标实体中,我得到了如下结果:

/**
 * @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
这导致我的数据库中有许多连接表如下所示:

/**
 * @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
我真的不喜欢这样,它使得数据库非常庞大和复杂。 我想在一个表中进行所有这些关联,其中目标实体的类被持久化。大概是这样的:

/**
 * @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
这在条令中是否可行?如果可能,性能如何?

您应该使用

您应该创建超类
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
{
    // ...
}