2013-03-12 14 views
0

我正在使用NestedSet樹方法來構建庫的樹。每個底層庫都有一組對象。在DoctrineExtension樹實體中包含OneToMany對象

這是在我的圖書館實體類定義的:

/** 
* @ORM\OneToMany(targetEntity="Object", mappedBy="library") 
*/ 
private $objects; 

在我的對象實體類,我有:

/** 
* @ORM\ManyToOne(targetEntity="Library", inversedBy="objects") 
**/ 
private $library; 

最後,我檢索與樹

$em = $this->getDoctrine()->getManager(); 
$repo = $em->getRepository('AcmeDemoBundle:Library'); 
$arrayTree = $repo->childrenHierarchy(); 

當執行childrenHierarchy()時,我得到了我的樹,但沒有Objects變量。例如:

[0] => Array 
    (
     [id] => 1 
     [name] => Foo 
     [left] => 1 
     [level] => 0 
     [right] => 6 
     [root] => 1 
     [__children] => Array 
      (
       [0] => Array 
        (
         [id] => 2 
         [name] => Bar 
         [left] => 2 
         [level] => 1 
         [right] => 3 
         [root] => 1 
         [__children] => Array 
          (
          ) 

        ) 

回答

0

原來,這並不容易解決。我最終編寫了一個DQL查詢,用它們的對象(連接,所以它只做一個查詢)獲取所有庫。

我再通過層次循環使用遞歸函數結合在一起的一切:

$em = $this->getDoctrine()->getManager(); 
$repo = $em->getRepository('AcmeDemoBundle:Library'); 
$allLibraries = $repo->findAllJoinedToObject(); 
$arrayTree = $repo->childrenHierarchy(); 

// merge the objects into the tree 
$merge = function(&$tree) use (&$merge, $allLibraries) { 
    foreach($tree as &$library) { 
     $id = $library['id']; 
     $library['objects'] = $allLibraries[$id]['objects']; 

     if(count($library['__children'])) { 
      $merge($library['__children']); 
     } 
    } 
}; 

$merge($arrayTree); 

下面是我的findAllJoinedToObject方法:

public function findAllJoinedToObject() 
{ 
    $query = $this->getEntityManager() 
     ->createQuery(' 
      SELECT l, o FROM acmeDemoBundle:Library l INDEX BY l.id 
      LEFT JOIN l.objects o INDEX BY o.id' 
     ); 

    try { 
     return $query->getArrayResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
}