2014-01-29 32 views
1

我有一個實體帳戶,它是一個有子女和父母的經典實體。我做到這一點的方式是,SQL關係只能由父母來確定。在數據庫中找到對象的子女

我想要的是每個對象的子對象列表。

在普通的舊PHP中,我只需循環一個mysql_fetch_array就可以擁有我的所有帳戶,並且每個請求都會再次請求DB到哪裏parent = id,然後將其放在我的帳戶對象的屬性children(array)中。

在Symfony2/doctrine中,似乎我不能那樣做,至少不是那麼簡單。

那我該怎麼辦呢?

編輯: 在我的控制器,這是我想怎樣做:

$COA = $this->getDoctrine()->getRepository('NRtworksChartOfAccountsBundle:Account')->findAll(); 

    foreach($COA as $one_account) 
    { 
     echo $one_account.getChildren(); 

    } 

但是,這並不工作。當我將這個$ COA傳遞給我的樹枝時,我可以循環使用它,但不能在PHP中使用。

<?php 
namespace NRtworks\ChartOfAccountsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 


/** 
* @ORM\Entity 
* @ORM\Table(name="Account") 
*/ 

class Account 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 

protected $id; 

/** 
* @ORM\Column(type="string", length=100, unique = true) 
*/ 

protected $name; 

/** 
* @ORM\Column(type="string", length=50) 
*/ 

protected $code; 

/** 
* @ORM\OneToMany(targetEntity="Account", mappedBy="parent") 
*/ 

private $children; 

/** 
* @ORM\ManyToOne(targetEntity="Account", inversedBy="children") 
*/ 

private $parent; 


public function __construct() 
{ 
    $this->children = new ArrayCollection(); 
} 

//getter & setter  

?>  
+0

您是否嘗試循環「帳戶」?在每個Account上調用'getChildren()'應該給你孩子們(如果關聯映射正確,否則工具欄將顯示一個錯誤)。什麼是上下文,在存儲庫中,在控制器中還是在小枝模板中? –

+0

謝謝,很高興知道。看看我的編輯,我的問題是,我不知道如何循環我的賬戶 – Eagle1

+1

'$ one_account.getChildren()'應該是'$ one_account-> getChildren()'。 –

回答

1

答案

你可以簡單地做:

$children = $account->getChildren(); 

然後遍歷這些孩子讓自己的孩子,等等,等等...

或者你可以使用DQL。將這個在custom repository

public function findByParent(Account $account) 
{ 
    $dql = 'SELECT a FROM Account a WHERE a.parent = :parentId'; 
    $q = $this->getEntityManager()->createQuery($dql); 
    $q->setParameter('parentId', $account->getId()); 

    return $q->getResult(); 
} 

然後(在例如控制器),你可以這樣做:

$children = $em->getRepository('Account')->findByParent($parent); 

然後遍歷這些孩子讓自己的孩子,等等,等等...

一些建議

這個過程不是很有效率,尤其是當樹變大時。

你應該看看l3pp4rd的Doctrine擴展的Tree behavior。它使用不同的設置,通過該設置可以只用1個查詢來獲取整個樹。 PS:如果您使用的是Symfony 2,您可以使用StofDoctrineExtensionsBundle來集成這些Doctrine擴展。

回答您的編輯

$one_account.getChildren()應該$one_account->getChildren()。 PHP中的點(.)用於連接字符串。

+0

嘿感謝。我已經對我的問題進行了編輯。我意識到還有別的東西,我不知道該怎麼辦:) ps:我已經安裝了StofDoctrineExtensionBundle,我也在嘗試它。但事實是,我也需要自己嘗試一些基本的東西,以便了解基礎知識。 – Eagle1

+0

@ jasper-n-brouwer嗨,很抱歉再次打電話給你,但沒有人似乎有這個答案。我終於轉向StofDoctrineExtension,這對於獲取樹的孩子非常方便。但問題是,我現在無法得到父母:( http://stackoverflow.com/questions/21538095/stofdoctrineextension-tree-entity-get-the-id-of-the-parent-in-twig – Eagle1