3

對於我的項目,我試圖使用Doctrine的繼承功能。我需要代表媒體(通過不同的表格:上傳文件一張,鏈接視頻一張,等等)。不同類型的繼承的多級別

但是,視頻可能因供應商不同而不同(例如Youtube,Dailymotion,您將其命名)。所以,我正在考慮通過SINGLE_TABLE繼承來做一個適合視頻表的另一個繼承。

但是,當我宣佈我的實體,似乎如果我添加在AbstractVideo實體,它擴展了AbstractMedia實體的SINGLE_TABLE繼承批註,則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,JOINED和SINGLETABLE。我的猜測是,這可能是問題所在。 – nakashu