Где в дискриминационных таблицах

Как выбрать все элементы из одного конкретного автора? Возможно ли это? Или как я могу редактировать объекты, если я хочу, чтобы многие типы элементов и пакеты предметов (элемент имел много элементов) тоже?

Пункт

/** * @ORM\Table() * @ORM\Entity * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="discr", type="string") * @ORM\DiscriminatorMap({ * "cd" = "ItemCD", * "dvd" = "ItemDVD", * "pack" = "ItemPack", * }) */ class Item { /** * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $id; /** * @ORM\Column(name="name", type="string", length=250, nullable=false) */ private $name; } 

ItemCD

 /** * @ORM\Table() * @ORM\Entity */ class ItemCD extends Item { /** * @ORM\ManyToOne(targetEntity="Author", inversedBy="item") * @ORM\JoinColumn(name="author_id", referencedColumnName="id") */ private $author; } 

ItemDVD

 /** * @ORM\Table() * @ORM\Entity */ class ItemDVD extends Item { /** * @ORM\ManyToOne(targetEntity="Author", inversedBy="item") * @ORM\JoinColumn(name="author_id", referencedColumnName="id") */ private $author; } 

ItemPack

 /** * @ORM\Table() * @ORM\Entity */ class ItemPack extends Item { /** * @ORM\ManyToMany(targetEntity="Item", inversedBy="item") * @ORM\JoinTable() */ private $items; } 

автор

 /** * @ORM\Table() * @ORM\Entity */ class Author { /** * @ORM\Column(name="id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") * */ private $id; /** * @ORM\Column(name="name", type="string", length=250, nullable=false) */ private $name; } 

Вам нужно будет запросить конкретные элементы. Это известное (и требуемое) ограничение, поскольку DQL является статическим типизированным языком: см. http://www.doctrine-project.org/jira/browse/DDC-16

Связано: как получить доступ к полям в унаследованной таблице в запросе doctrine2 / dql

Способ обработки этого с помощью обходного пути заключается в использовании 2 подзапросов в вашем DQL:

 SELECT i FROM Item i WHERE i.id IN( SELECT i2.id FROM ItemDvd i2 WHERE i2.author = :author ) OR i.id IN( SELECT i3.id FROM ItemCd i3 WHERE i3.author = :author ) 

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

Изменить: чтобы получить все пакеты от данного автора (вместе с отдельными DVD-дисками или компакт-дисками), запрос становится еще хуже:

 SELECT i FROM Item i WHERE i.id IN( SELECT i2.id FROM ItemDvd i2 WHERE i2.author = :author ) OR i.id IN( SELECT i3.id FROM ItemCd i3 WHERE i3.author = :author ) OR i.id IN( SELECT i4.id FROM ItemPack i4 JOIN i4.items i5 WHERE i5.id IN ( SELECT i6.id FROM Item i6 WHERE i6.id IN( SELECT i7.id FROM ItemDvd i7 WHERE i7.author = :author ) OR i6.id IN( SELECT i8.id FROM ItemCd i8 WHERE i8.author = :author ) ) ) 

Сделать $author в Item и иметь ItemPacks $author value всегда равно null. Тогда вы можете сделать:

 $em->findBy("Item", array("author" => $author)); 

И вы всегда получаете экземпляры ItemDVD или ItemCD .

Это сложный и длинный ответ. Я думаю, что Entities aproach в порядке, и, запросив элемент объекта, вы получите то, что хотите. Теперь для форм вам, вероятно, понадобится один FormType для каждого элемента, а затем пользователь aproach для коллекций форм ( http://symfony.com/doc/2.1/cookbook/form/form_collections.html ), и я уверен, что вы необходимо будет подключиться к событию pre-bind для подготовки данных.

Это быстрая мысль, может быть, это может вам помочь.