这是我的问题。
我在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问题或者我做错了什么?
答案 0 :(得分:1)
我有完全相同的问题 - 在我的情况下 - 将其追溯到Symfony \ Bridge \ Doctrine \ Form \ ChoiceList \ ORMQueryBuilderLoader。
在验证表单时,通过向查询构建器添加IN()子句,ORMQueryBuilderLoader :: getEntitiesByIds()中的主键加载实体。在我的例子中,这个IN()子句无效,并且返回了所有可选实体。
这反过来导致Symfony \ Component \ Form \ Extension \ Core \ DataTransformer \ ChoicesToValuesTransformer :: reverseTransform()抛出TransformationFailedException,因为加载的实体数和提交的选项不一样。
我想这个特定错误还有其他可能的原因。这是你可以尝试的:
答案 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');
我不知道究竟是什么区别以及为什么现在正在发挥作用。 但这很有效。
谢谢大家的帮助。