"此值无效"当使用" query_builder" on" entity" symfony2.1上的buildForm

时间:2013-03-04 00:32:16

标签: symfony entity query-builder

这是我的问题。 我在symfony 2.1上使用buildForm方法来构建我的表单。 使用以下代码,一切正常:

$builder->add('combat','entity',array(
                    class' => 'KarateCompetitionBundle:CompetitionCombat',
                    'empty_value' => 'Sélectionner un combat'));

但我想过滤并只显示一些Combat。这就是我必须使用query_builder选项的原因。当我这样做时,我收到This value is not valid错误消息。 这是代码:

$builder->add('combat','entity',array(
                  'class' => 'KarateCompetitionBundle:CompetitionCombat',
                  'empty_value' => 'Sélectionner un combat',
                  'query_builder' => function(CombatRepository $cr) {
                      return $cr->getAllWithoutBilanQueryBuilder();}));

我尽量减少代码(即没有对getAllWithoutBilanQueryBuilder方法进行过滤)以便能够找到问题。

public function getAllWithoutBilanQueryBuilder(){
    $queryBuilder = $this->getEntityManager()->createQueryBuilder();
    return $queryBuilder->select('c')->from('KarateEntrainementBundle:CompetitionCombat', 'c');

}

我比较了每种情况下生成的两个html代码,它们是相同的。

在将表单与请求var_dump($object)绑定后,我在控制器上放了一个$form->bind($request),当我使用query_builder选项时,combat显示为null如果我不使用它,则不为空。

我无法理解为什么? 我在网上发现了一些相同问题的帖子,但没有答案。 这里是否存在symfony问题或者我做错了什么?

3 个答案:

答案 0 :(得分:1)

我有完全相同的问题 - 在我的情况下 - 将其追溯到Symfony \ Bridge \ Doctrine \ Form \ ChoiceList \ ORMQueryBuilderLoader。

在验证表单时,通过向查询构建器添加IN()子句,ORMQueryBuilderLoader :: getEntitiesByIds()中的主键加载实体。在我的例子中,这个IN()子句无效,并且返回了所有可选实体。

这反过来导致Symfony \ Component \ Form \ Extension \ Core \ DataTransformer \ ChoicesToValuesTransformer :: reverseTransform()抛出TransformationFailedException,因为加载的实体数和提交的选项不一样。

我想这个特定错误还有其他可能的原因。这是你可以尝试的:

  • 查看生成的查询,手动运行并确保仅返回 所选值
  • 在Symfony \ Component \ Form \ Form中,尝试输出捕获的TransformationFailedException并查看它引导您的位置。
  • 如果以上都不合理,请将一些调试输出添加到Symfony \ Component \ Form \ Extension \ Validator \ Constraints \ FormValidator,看看是否可以稍微缩小范围。

答案 1 :(得分:1)

作为@ mike-b的补充答案:对我来说,QueryBuilder语句失败了 - >有('...')查询部分:

    ...
    'query_builder' => function(EntityRepository $er) use ($pn) {
                    return $er->createQueryBuilder('p')
                                    ->select('p')
                                    ->join('p.product', 'pr')
                                    ->where('p.name = ' . $pn->getId())
                                    ->andWhere("LENGTH(p.value_en) > 1")
                                    ->andWhere("p.value_en != ''")
                                    /* when I remove this - validation passe flawlessly  */
                                    ->having('COUNT(pr.id) > 1')
                                    ->groupBy('p.value_en)
                                    ->orderBy('p.value_en', 'ASC');
    ...

使用Symfony版本2.3.6进行测试

答案 2 :(得分:0)

我终于成功了: - )

所以这是修复。 在getAllWithoutBilanQueryBuilder函数上,我替换

$queryBuilder = $this->getEntityManager()->createQueryBuilder(); 

通过

$queryBuilder = $this->createQueryBuilder('c');

我不知道究竟是什么区别以及为什么现在正在发挥作用。 但这很有效。

谢谢大家的帮助。