クエリビルダーの機能にエンティティを配置したい:
->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'の式は許可されません
それでは、クエリビルダーに情報を提供する(最良の)方法は何でしょうか。
次のようにパラメータを個別に設定する必要があります。
->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);
}
整数または文字列のいずれかを使用できますが、構文はそれぞれわずかに異なります。 ドキュメント を参照してください
私は最近、ほぼ同じ問題に出くわしました。唯一の違いは、「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配列にアクセスし、そこからパラメーターを使用してクエリビルダーを呼び出すことができます。
これが誰かに役立つことを願っています!