【问题标题】:find the children of an object in the database在数据库中查找对象的子对象
【发布时间】:2014-01-29 14:59:55
【问题描述】:

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

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

在普通的旧 PHP 中,我将简单地循环一个 mysql_fetch_array 以获取我的所有帐户,并为每个请求再次向 parent = id 的 DB 请求,并将其放入我的帐户对象的属性 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    

?>    

【问题讨论】:

  • 您是否尝试过遍历Accounts?在每个 Account 上调用 getChildren() 应该会给您孩子(如果关联映射正确;如果不正确,工具栏将显示错误)。在存储库、控制器或 Twig 模板中的上下文是什么?
  • 很高兴知道这一点。看看我的编辑,我的问题是我不知道如何循环访问我的帐户
  • $one_account.getChildren() 应该是 $one_account-&gt;getChildren()

标签: php symfony doctrine


【解决方案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-&gt;getChildren()。 php中的点(.)用于连接字符串。

【讨论】:

  • 嘿,谢谢。我对我的问题进行了编辑。我意识到还有其他事情我不知道该怎么做 :) ps:我已经安装了 StofDoctrineExtensionBundle,我也在尝试。但事实是,我也需要自己尝试基本的东西才能理解基础知识。
  • @jasper-n-brouwer 嗨,很抱歉再次打电话给您,但似乎没有人有这个答案。我终于求助于 StofDoctrineExtension,它非常方便地获取树的孩子。但是问题是我现在找不到父母了:(stackoverflow.com/questions/21538095/…
猜你喜欢
  • 1970-01-01
  • 2020-12-05
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2020-06-29
相关资源
最近更新 更多