3

Для моего проекта я пытаюсь использовать функцию наследования Doctrine. Мне нужно представлять медиумы (через разные таблицы: одна таблица для загруженных документов, одна для связанных видеороликов и т. Д.).Множественный уровень разного рода наследования

Но видео может варьироваться от поставщика к провайдеру (например, Youtube, Dailymotion, вы называете его). Итак, я думал о другом наследовании, соответствующем таблице видео, через наследование SINGLE_TABLE.

Но, когда я объявляю мои сущности, мне кажется, что если я добавить SINGLE_TABLE наследования аннотации на AbstractVideo субъекте, который расширяет AbstractMedia сущности, Video таблицы не создается (и не обнаружена). Вот отрывок из этих двух сущностей:

<?php 
namespace Acme\Demo\Entity; 

use Datetime; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Media") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="type", type="string") 
*/ 
abstract class AbstractMedia 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    // some other fields 
} 

/** 
* @ORM\Entity 
* @ORM\Table(name="Video") 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="provider", type="string") 
* @ORM\DiscriminatorMap({}) 
*/ 
abstract class AbstractVideo extends AbstractMedia 
{ 
    /** @ORM\Column(type="string") */ 
    private $name; 

    // some other fields 
} 

Я уже пытался иметь отображенный объект к Foo сущности, расширяя AbstractVideo, но потом, когда я пытаюсь оставаться что-то, он говорит, что это не является допустимым организация.

Любые идеи, или я должен избегать такого глубокого наследования? Спасибо

+1

Смешанное наследование в настоящее время не поддерживается Doctrine ORM – Ocramius

ответ

0

As @OCramius said in a comment to my question, это не поддерживается Doctrine ORM. Поэтому, чтобы делать то, что я хотел сделать, я буду хранить объект значения в свойстве data моего объекта, сохраняя свойство «дочерних классов» вместо того, чтобы иметь глубокий различный вид наследования.

<?php 
class Video extends AbstractMedia 
{ 
    // returns the value object youtube, dailymotion, ... etc 
    public function getData();  
} 

class Youtube 
{ 
    //public function ... 
} 

class Dailymotion 
{ 
    // public funciton ... 
} 
0

Не уверен, что это именно то, что вам нужно, но это из производственного кода, который я использую.

Мы наследуем файл с другими объектами, и они также наследуются. Важная часть состоит в том, чтобы добавить наследующие (расширяющие) объекты к карте дисфинатора.

/** 
* File 
* 
* @ORM\Table(name = "file") 
* @ORM\Entity(repositoryClass="Living\ApiBundle\Entity\File\FileRepository") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="type", type="string", length=64) 
* @ORM\DiscriminatorMap({ 
*  "file" = "Something\Entity\File\File", 
*  "image" = "Something\Entity\Image\Image", 
*  "specialImage" = "Something\Entity\Image\SpecialImage", 
* }) 
*/ 
class File implements FileEntityInterface 

..... 

/** 
* ImageFile 
* 
* @ORM\Table(name="image") 
* @ORM\Entity(repositoryClass="Living\ApiBundle\Entity\Image\ImageRepository") 
*/ 
class Image extends File implements ImageEntityInterface 
+0

Не будет ли создана таблица «SpecialImage»? Это то, чего я хочу избежать – Talus

+0

, кроме того, я хочу различать столбец, который является специфическим для объекта «Image» (или «AbstractVideo» в моем случае) – Talus

+0

, вы правы. Это создаст новые таблицы. Я был в замешательстве, потому что видел, что вы тоже получили тип наследования «JOINED». кажется, что вы смешиваете два типа Ingeritencetypes, присоединяемых и синглов. Я предполагаю, что это может быть проблемой. – nakashu