3

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

$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时,如果我不使用它,则它是空的,而它不是空的。

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

4

3 回答 3

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 看看你是否可以缩小范围。
于 2013-04-19T21:47:36.550 回答
1

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

    ...
    '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 版测试

于 2013-11-06T10:55:25.787 回答
0

我终于设法使它工作:-)

所以这里是修复。在getAllWithoutBilanQueryBuilder功能上,我替换

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

经过

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

我不知道到底有什么区别以及为什么现在可以使用。但这是有效的。

谢谢大家的帮助。

于 2013-04-30T18:36:33.070 回答