如何在自定义字段类型上使用动态查询?我的意思是:
我想创建一个自定义实体类型表单字段,其中列出了我的所有supplier
实体...但是,我希望该自定义表单字段具有附加选项byStatus
。然后应该使用该选项(如果已设置)来设置query_builder
选项,以便仅检索状态等于byStatus
选项的供应商。
所以这是我的供应商类型:
class SupplierType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'class' => 'AppBundle:Supplier',
'byStatus' => 1,
'query_builder' => function (EntityRepository $er) {
$q = $er->createQueryBuilder('s')
->orderBy('s.name', 'ASC')
->andWhere('s.status = :status')
->setParameter('status', ????);
return $q;
}
));
}
public function getParent()
{
return EntityType::class;
}
}
那么如何用????
选项值替换byStatus
。
当然,在使用字段类型时应该可以更改byStatus
选项。
像这样:
$formMapper->add('supplier', SupplierType::class, [
'byStatus' => -1,
]);
答案 0 :(得分:2)
好的,我找到了。其实很简单:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'class' => 'AppBundle:Supplier',
'byStatus' => 1,
));
$resolver->setDefault('query_builder', function (Options $options) {
return function (EntityRepository $er) use ($options) {
return $er->createQueryBuilder('s')
->orderBy('s.name', 'ASC')
->andWhere('s.status = :status')
->setParameter('status', $options['byStatus']);
};
});
}
答案 1 :(得分:0)
如果你想从另一个字段传递选项,我建议使用setNormalizers
因为它允许你传递选项,即其他值,如下所示:
public function configureOptions(OptionsResolver $resolver)
{
// ... your setup without the query builder...
$resolver->setNormalizers([
'query_builder' => function (Options $options, $value) {
return function (EntityRepository $er) use ($options) {
return $er->createQueryBuilder('s')
->orderBy('s.name', 'ASC')
->andWhere('s.status = :status')
->setParameter('status', $options['byStatus'] ?? 1);
};
},
]);
}
请参阅OptionsResolver的文档:https://symfony.com/doc/current/components/options_resolver.html#option-normalization
编辑:我添加了?? 1
,它只适用于PHP7 +,但是在没有设置选项时它提供了一些安全性。如果您不知道它是什么,请在php文档中搜索null coalesce operator。