如何从一位特定作者中选择所有项目?它可能这样吗?或者如果我想要很多项目类型和项目包(项目包含很多项目),我该如何编辑实体?
项目
/**
* @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;
}
答案 0 :(得分:7)
您必须查询特定元素。这是一个已知(并且想要)的限制,因为DQL是一种静态类型语言:请参阅http://www.doctrine-project.org/jira/browse/DDC-16
相关:how to access fields in inherited table in doctrine2 / dql query
使用解决方法处理此问题的方法是在DQL中使用2个子查询:
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或CD),查询会变得更糟:
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
)
)
)
答案 1 :(得分:1)
在Item中设置$author
并使ItemPack $author
值始终为null。然后你可以这样做:
$em->findBy("Item", array("author" => $author));
您始终会获得ItemDVD
或ItemCD
的实例。
答案 2 :(得分:0)
答案很棘手,冗长。 我认为Entities aproach是可以的,通过查询项目实体,你会得到你想要的。 现在对于表单,您可能需要每个子项一个FormType,然后使用表单集合(http://symfony.com/doc/2.1/cookbook/form/form_collections.html)的方法,并且我确定您需要挂钩到预绑定事件以准备数据
这是一个快速思考,可能它可以帮助你。