Я довольно новичок в Доктрине, поэтому любые общие советы приветствуются. Я пытаюсь достичь:Однозначное наследование (STI) с отношением ManyToOne
На странице могут быть как видео, так и фотографии. Оба являются средами и общими свойствами, поэтому я думал, что однозначное наследование имеет смысл. Вот соответствующие части моей установки:
Page
/**
* @ORM\Entity
*/
class Page {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\OneToMany(targetEntity="Media", mappedBy="page", cascade={"persist"})
* @var ArrayCollection|Media[]
*/
protected $media;
/**
* @return Media[]|ArrayCollection
*/
public function getMedia()
{
return $this->media;
}
}
Медиа
/**
* @ORM\Entity
* @ORM\Table(name="media")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="media_type", type="string")
* @ORM\DiscriminatorMap({"video" = "Video", "photo" = "Photo"})
*/
abstract class Media {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @ORM\Column(type="string")
*/
protected $url;
/**
* @ORM\ManyToOne(targetEntity="Page", inversedBy="media")
*/
protected $page;
}
Фото
/**
* @ORM\Entity
*/
class Photo extends Media {
/**
* @ORM\Column(type="string")
*/
protected $exif;
}
Видео
/**
* @ORM\Entity
*/
class Video extends Media {
/**
* @ORM\Column(type="integer")
*/
protected $length;
}
Это отлично работает, но и это самое мое вопрос- как я извлечь все Photo
с или Video
сек страницы. Я пытался добавить такие вещи, как
/**
* @ORM\OneToMany(targetEntity="Photo", mappedBy="page", cascade={"persist"})
* @var ArrayCollection|Photo[]
*/
protected $photos;
к Page
, но это приводит к ошибке схемы, так как она не имеет обратного, определенный на фото. Любая помощь очень ценится!
Это ответ, который я искал. Благодарим вас за то, что вы назвали плюсы и минусы + альтернативным решением, используя репозиторий. – DerLola