23

エンティティをクエリ ビルダーの関数に入れたい:

->add( 'weeks', 'entity', array(
    'class' => 'MV\CaravanBundle\Entity\CaravanRow',
    'property' => 'line',
    'query_builder' => function(EntityRepository $er ) use ( $caravan ) {
        return $er->createQueryBuilder('w')
                  ->orderBy('w.dateFrom', 'ASC')
                  ->where('w.caravan = ?', $caravan )
                  ->andWhere('w.visible = 1')
                  ->andWhere('w.booked = 0');
}

しかし、メッセージを取得します:

タイプ 'Entity\Name' の式は、このコンテキストでは許可されていません

それでは、クエリビルダー情報を提供する(最良の)方法は何ですか。

4

2 に答える 2

43

次のようにパラメータを個別に設定する必要があります。

->add( 'weeks', 'entity', array(
    'class' => 'MV\CaravanBundle\Entity\CaravanRow',
    'property' => 'line',
    'query_builder' => function(EntityRepository $er ) use ( $caravan ) {
        return $er->createQueryBuilder('w')
                  ->orderBy('w.dateFrom', 'ASC')
                  ->where('w.caravan = ?1')
                  ->andWhere('w.visible = 1')
                  ->andWhere('w.booked = 0')
                  ->setParameter(1, $caravan);
}

整数または文字列のいずれかを使用できますが、構文はそれぞれわずかに異なります。ドキュメントを見る

于 2012-12-12T19:45:00.747 に答える
15

最近、ほぼ同じ問題に遭遇しました。唯一の違いは、「query_builder」オプションを「setDefaultOptions」内で設定する必要があることです。基本的に、フォームは次のように作成されます。

$builder->add('field', 'query_type', array('id' => 1));

「query_type」クラスは次のようになります。

class QueryType extends AbstractType
{
     public function setDefaultOptions(OptionsResolverInterface $options)
     {
              $resolver->setRequired(array('id'));

              $resolver->setNormalizers(array(
                  'query_builder' => function (Options $options, $configs) {
                          return function (EntityRepository $er) use ( $options ) {
                              return $er->getSomething( $options['id'] );

                       };
                  },
              ));
     }
}

setNormalizers 関数を使用して $options 配列にアクセスし、そこからパラメーターを指定して querybuilder を呼び出すことができます。

これが誰かに役立つことを願っています!

于 2013-09-19T11:41:18.637 に答える