Symfony - 按自定义选项过滤自定义EntityType字段中的实体

时间:2017-10-14 09:26:57

标签: php symfony

如何在自定义字段类型上使用动态查询?我的意思是: 我想创建一个自定义实体类型表单字段,其中列出了我的所有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,
]);

2 个答案:

答案 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。