【发布时间】:2013-05-02 17:57:20
【问题描述】:
我面临的问题是我必须以包含所有父实体(类别实体)的形式创建一个选择框。现在我设法做到了:
$builder->add('parent', 'entity', array(
'class' => 'KprCentarZdravljaBundle:Category',
'query_builder' => function($repository) use ($param, $catID) {
return $repository->createQueryBuilder('p')
->where('p.id != :id AND p.parent = :parent')
->setParameters(array('id' => $param, 'parent' => $catID));},
'property' => 'name',
'required' => false,
'attr' => array('data-placeholder' => '--Izaberite Opciju--'),
));
如你所见,我传递了 2 个参数,第一个是当前的 category.id(一个类别不能是它自己的父级),第二个是一个父级 id,因为我想要那个父级的所有子级。这很好用,但它没有给我父母孩子的孩子。 我创建了一个具有递归函数的 CategoryRepository,它返回所有子项:
<?php
namespace Kpr\CentarZdravljaBundle\Entity;
use Doctrine\ORM\EntityRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Kpr\CentarZdravljaBundle\Entity\Category;
class CategoryRepository extends EntityRepository
{
public function findByParenting($parent)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->add('select', 'cat')
->add('from', 'KprCentarZdravljaBundle:Category cat')
->add('where', 'cat.parent = :parent')
->setParameter('parent', $parent);
// $qb instanceof QueryBuilder
$query = $qb->getQuery();
$results = $query->getResult();
foreach($results as $result){
if($result->getParent()){
$newResult = $this->findByParenting($result->getId());
$results = array_merge($results, $newResult);
}
}
return $results;
}
}
如何在实体字段中使用 findByParenting($parent) 函数?
【问题讨论】:
-
有人吗?我真的需要帮助:(...
-
我问了另一个问题,我在这里取得了一些进展stackoverflow.com/questions/16463926/…
-
您是否尝试将表单类型中的“function($repository)...”的内容替换为“return $repository->findByParenting(...)”?
-
是的,我试过了,我得到了以下错误“类型为“Doctrine\ORM\QueryBuilder”的预期参数,“给定数组”。这就是我想要选择字段的原因,因为我使用 findByParenting(...) 提供结果,我无法返回查询构建器实例
-
嗯,这很烦人。也许您可以在构造时将实体管理器传递给表单类型,并将实体字段的选择选项直接设置为 findByParenting() 的结果?
标签: symfony doctrine-orm symfony-forms symfony-2.2