在数据库中查找对象的子项

时间:2014-01-29 14:59:56

标签: php symfony doctrine

我有一个实体帐户,这是一个有孩子和父母的经典实体。我这样做的方式,只与父母一起识别SQL关系。

我想要的是为每个对象提供其子列表。

在普通的旧PHP中,我只是在mysql_fetch_array上循环以获取我的所有帐户,并且每次请求再次向DB所在的父项= id,并将其放入我的帐户对象的属性children(数组)中。

在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    

?>    

1 个答案:

答案 0 :(得分: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 Extensions的Tree behavior。它使用不同的设置,您只需1次查询就可以获取整个树。

PS:如果您使用的是Symfony 2,则可以使用StofDoctrineExtensionsBundle集成这些Doctrine Extensions。

回答您的修改

$one_account.getChildren()应为$one_account->getChildren()。 php中的一个点(.)用于连接字符串。