如何在 FormType 中使用 Repository 自定义函数

问题描述 投票:0回答:2

我面临的问题是我必须以包含所有父实体(类别实体)的表单创建一个选择框。现在我成功做到了:

$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--'),
                ));

正如你所看到的,我传递的第一个参数是当前的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) 函数?

php symfony doctrine-orm symfony-forms symfony-2.2
2个回答
1
投票

我发布了答案:Symfony2 选择字段不起作用。谢谢redbirdo


0
投票

您遇到此错误是因为您必须在

findByParenting($parent)
函数上返回 QueryBuilder 对象

public function findByAllocation($alloc) 
    {
      return $qb = $this->createQueryBuilder('r')
               ->select('r')
               ->where('r.showRangeStart < :alloc', 'r.showRangeStop >= :alloc')
               ->setParameter('alloc', $alloc)
               ;

    }
© www.soinside.com 2019 - 2024. All rights reserved.