Symfony2 buildForm - 使用count添加实体类型输入

时间:2015-02-12 10:46:42

标签: php symfony doctrine-orm

我尝试添加带有计数的输入以生成注册号。 如(二千零十四分之二) 2 - >计数+ 1 2014年 - >这一年

我使用此代码:

            ->add('registration_number', 'entity', array(
            'class' => 'FrontBundle:User',
            'query_builder' => function(EntityRepository $er) {
                return $er->createQueryBuilder('u')
                    ->select('count(u.id)')
                    ->groupBy('u.id')
                    ->getQuery()
                    ->getResult();
            },
        ))

但是我收到了错误:

  

Doctrine\ORM\QueryBuilder类型的预期参数,array已给出。

我尝试了这个解决方案但没有成功

1-删除该行 - > getResult()

return $er->createQueryBuilder('u')
                    ->select('count(u.id)')
                    ->groupBy('u.id')
                    ->getQuery();

错误:

  

类型" Doctrine \ ORM \ QueryBuilder"的预期参数,   "学说\ ORM \查询"给定

2-删除最后2行

return $er->createQueryBuilder('u')
                    ->select('count(u.id)');

错误:

  

警告:get_class()期望参数1为对象,给定字符串

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

您未从EntityRepository中选择实体结果。一个疯狂的猜测:它返回一个COUNT(u.id)字符串而不是一组实体。

看起来'entity'表单类型不适合您的任务。如果您需要添加注册号,我相信它应该是文本输入(或者可能是隐藏字段,取决于您想要的内容)。因此,您不应该添加实体字段,而应事先生成注册号并将其与表单数据一起传递。如果您要为用户创建表单,则应该如下所示:

// Your controller action
$user = new \FrontBundle\Entity\User();

$qb = $this->getDoctrine()->getRepository('FrontBundle:User')->createQueryBuilder('u');

$regNumber = $qb->select('count(u.id)')
                 ->groupBy('u.id')
                 ->getQuery()
                 ->getResult();

$user->setRegNumber($regNumber);

$form = $this->createForm(new UserType(), $user);

// Your form
// @var FormBuilderInterface $formBuilder
$formBuilder->add('regNumber', 'text', array());

答案 1 :(得分:0)

如果在打开表单时生成了注册号,则可能会为多个用户分配相同的号码。这可以通过在提交表单时分配注册号来最小化。在下文中,我还假设User实体中存在属性registrationNumber。它是这样的:

控制器

...
$em = $this->getDoctrine()->getManger();
...
if ($form->isValid()) {
    ...
    $allUsers = $em->getRepository("YourBundle:User")->findAll();
    $n = count($allUsers) + 1;
    $date = new \DateTime();
    $year = date_format($date, 'Y');
    // make it sortable
    $l = strlen($n);
    $regNumber = $year . str_repeat('0', 5 - $l) . $n;
    $user->setRegistrationNumber($regNumber);
    ....