庫子我有一個實體,說的人,其中包含$pets
列表:獲得使用類表繼承
protected $pets;
public function getPets()
{
return $this->pets;
}
標準原則。不幸的是,這些寵物可能是不同類型的,如貓或狗,或混合物。所以我用Class Table繼承:
/**
* @ORM\Entity
* @ORM\Table(name="pets")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="pettype", type="string")
* @ORM\DiscriminatorMap({"cat_animal" = "CatAnimal", "dog_animal" = "DogAnimal"})
*/
class Pet
{
/**
* @ORM\Column(name="eventid", type="integer")
* @ORM\Id
*/
private $id; // protected did not work either
/**
* Get id
*/
public function getId()
{
return $this->id;
}
}
/**
* @ORM\Entity
* @ORM\Table(name="cat_animal")
*/
class CatAnimal extends Pet
{
/**
* @ORM\Column(type="float")
*/
protected $height;
// etc.
}
// DogAnimal class omitted.
這是相對簡單的使用Doctrine's docs。
如果我想所有的貓都爲個人,我發現我可以這樣做:
public function getCats($person)
{
return $this->getEntityManager()->getRepository('MyBundle:CatAnimal')
->findByPerson($person);
}
但是,我怎麼訪問使用查詢構建器的子類?如果我有人身庫(這裏$回購),我想要做的東西像下面這樣:
$repos->createQueryBuilder('person')
->select('pet.height')
->join('person.pets', 'pet')
->where('person = :person')
->setParameter('person', $person);
除了寵物沒有高度,所以這會拋出異常。生成的DQL自動連接到DogAnimal和CatAnimal,所以我應該能夠訪問這些屬性,但我不知道如何。我曾嘗試過:
$repos->createQueryBuilder('person')
->select('cat.height')
->from('MyBundle:CatAnimal', 'cat)
->join('person.pets', 'pet')
->where('person = :person')
->setParameter('person', $person);
但是,這似乎做笛卡爾產品。我可以通過加入來解決這個問題:
->andWhere('person.id = cat.person')
這似乎過分複雜,我想要什麼。我試圖尋找正確的方法來做到這一點,但資源是有限的。
這建立在previous question上,具有相似的結構。表格的名稱爲了清晰和一般而改變。
你想選擇由QueryBuilder的一個人擁有的所有的CatAnimals? – chapay 2015-01-21 11:14:48
@Andrey是的,非常。以這種方式,我可以對它執行更多的查詢。我相信讓的答案是我正在尋找的。 – Druckles 2015-01-21 23:51:05
查詢生成器生成的DQL自動與任何存儲庫中的子類連接。問題應該是,如何使用查詢構建器別名或獲取子類的現有別名?爲了澄清,雖然貓和狗都加入寵物,但不能在查詢生成器中使用「身高」或「貓。高度」。 – Druckles 2015-01-22 17:33:07