3

これが私の問題です。buildFormフォームを作成するためにsymfony2.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)を使用するとnullになりますが、使用しない場合はnullではないようです。query_buildercombat

どうしてかわからないの?同じ問題の投稿はウェブ上にほとんど見つかりませんでしたが、答えのある投稿はありませんでした。ここに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ステートメントの失敗は-> hasing('...')クエリ部分でした:

    ...
    '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 に答える