【问题标题】:How to use Repository custom functions in a FormType如何在 FormType 中使用存储库自定义函数
【发布时间】: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


【解决方案1】:

我发布了答案:Symfony2 choice field not working。谢谢redbirdo

【讨论】:

  • 您可以从存储库中返回查询生成器并在表单类型中使用它...
  • 其实我做不到,因为 findByParenting($parent) 是一个递归函数,它从 $parent 和他们的孩子等等中获取所有的孩子,把它们放在一个数组中并返回结果。
  • 当 Doctrine 为您处理这些问题时,您为什么需要这样做? stackoverflow.com/a/6391807/206546
  • 那么我该如何解决我的问题呢?我从我的存储库返回一个查询构建器并将这个查询构建器加载到我的实体字段中,并且我的字段仅由第一级子项填充。我已经试过了......你发送的这个链接答案,首先:使用 getArrayReslut() 只返回第一级孩子,第二:使用 foreach $parent->getChildren() as $child 没有解决我的问题,因为我不知道如何我必须挖掘很多级别,可能有 100 个级别,这就是我使用递归函数的原因。
  • 那么我猜你接受的答案是适合你的。但是,您的情况似乎很极端,我想为那些没有 100 个嵌套级别(zoik)的人提供更简单的答案作为脚注
【解决方案2】:

您遇到此错误是因为您必须在 findByParenting($parent) 函数上返回 QueryBuilder 对象

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

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    相关资源
    最近更新 更多