2015-01-20 24 views
2

庫子我有一個實體,說的人,其中包含$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上,具有相似的結構。表格的名稱爲了清晰和一般而改變。

+0

你想選擇由QueryBuilder的一個人擁有的所有的CatAnimals? – chapay 2015-01-21 11:14:48

+0

@Andrey是的,非常。以這種方式,我可以對它執行更多的查詢。我相信讓的答案是我正在尋找的。 – Druckles 2015-01-21 23:51:05

+0

查詢生成器生成的DQL自動與任何存儲庫中的子類連接。問題應該是,如何使用查詢構建器別名或獲取子類的現有別名?爲了澄清,雖然貓和狗都加入寵物,但不能在查詢生成器中使用「身高」或「貓。高度」。 – Druckles 2015-01-22 17:33:07

回答

1

您需要正確連接到Person,並在Pet類中添加一個字段。在我的例子我把它命名爲owner

$catRepo->createQueryBuilder('cat') 
    ->select('cat.height') 
    ->from('MyBundle:CatAnimal', 'cat') 
    ->join('cat.owner', 'person') 
    ->where('person = :person') 
    ->setParameter('person', $person); 
+0

是否可以從人員/所有者存儲庫執行此操作? – Druckles 2015-01-22 13:36:04

+0

當然,你應該反過來加入。 但是這在概念上是錯誤的,你應該從PersonRepository獲取有關Person的數據。 – Jean 2015-01-22 17:51:29

+0

這是關於人的數據:哪些貓屬於那個人。 – Druckles 2015-01-22 21:38:59