2017-12-27 312 views
0

我有一個家譜這樣的:自參照孩子不附

class Family 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var Family 
    * 
    * @ORM\ManyToOne(targetEntity="Family", inversedBy="children") 
    */ 
    private $parent; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string") 
    */ 
    private $name; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Family", mappedBy="parent") 
    */ 
    private $children; 

    // [...] 
} 

我試圖findAll(),並得到家長和孩子連接

$familyRepo = $this->em->getRepository(Family::class); 
$families = $familyRepo->findAll(); 
foreach ($families as $family) { 
    dump($family->getParent()->getName()); 
} 

我可以看到父母的名字甩並且只執行一個查詢,所以他們很好地連接。

但是,如果我試圖表明孩子:

dump($family->getChildren()->count()); 

我看到儘可能多的查詢,有家庭。

我怎樣才能讓父母親陪伴的孩子? (沒有更多疑問)

我忘了什麼?

回答

0

在一個一對多的關係爲$children您可以指定如下,以預先抓取對象:

/** 
* @var ArrayCollection 
* 
* @ORM\OneToMany(targetEntity="Family", mappedBy="parent", fetch="EAGER") 
*/ 
private $children; 

docs看到其他PARAMS。

+0

我希望孩子們不要一直熱切地提取。除此之外,我也嘗試過,但某些家庭仍然加載了額外的查詢。 –

+0

然後,在您的FamilyRepository中,您需要添加一個'findAllSomething'方法,您可以在其中添加連接「children」關係的查詢,以便在單個查詢中獲取它們。當你想要使用這種查找器而不是普通的'findAll'來保存查詢時。 – dlondero

+0

這是一個想法,我雖然沒有。我會試一試 –

0

按照@ dlondero的建議,我強制將深度提取放入存儲庫。

這裏是我做的事:

public function getRootNodes($eagerLevels = 5) 
{ 
    $qb = $this->createQueryBuilder('entity0') 
     ->select('partial entity0.{id, name, parent}') 
     ->where('entity0.parent IS NULL') 
    ; 
    for ($i = 0; $i < $eagerLevels; $i++) { 
     $qb 
      ->leftJoin('entity'.$i.'.children', 'entity'.($i+1)) 
      ->addSelect('partial entity'.($i+1).'.{id, name, parent}') 
     ; 
    } 

    return $qb->getQuery()->getResult(); 
} 

這部分提取正是我需要的所以沒有延遲加載發生。
我也做了深度配置的級別。