我有一个实体帐户,这是一个有孩子和父母的经典实体。我这样做的方式,只与父母一起识别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
?>
答案 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中的一个点(.
)用于连接字符串。