首页 > 解决方案 > EasyAdmin (v2):按相关实体的属性过滤列表视图

问题描述

我愿意完全实现在 Symfony 上的 EasyAdmin (v.2) 文档中描述的那种列表过滤(自定义动态过滤器),即通过相关实体的属性过滤实体的列表视图(例如,按给定国家的客户)。

由于文档中只有以下代码块,我对如何使用通常的两个选择列表创建自定义 EntityTypeFilter 非常迷茫(相同/不同的列表和可用国家/地区的列表通过客户关联进行订购)。configureOptions()getParent()函数应该是什么?

谢谢 !

# config/packages/easy_admin.yaml
easy_admin:
    entities:
        Users:
            class: App\Entity\Order
            list:
                filters:
                    # 'country' doesn't exist as a property of 'Order' so it's
                    # defined as 'not mapped' to avoid errors
                    - property: 'country'
                      type: 'App\Form\Filter\CustomerCountryFilterType'
                      mapped: false
// App\Form\Filter\CustomerCountryFilterType
// ...

public function filter(QueryBuilder $queryBuilder, FormInterface $form, array $metadata)
{
    if (null !== $form->getData()) {
        $queryBuilder
            ->leftJoin('entity.customer', 'customer')
            ->andWhere('customer.country = :country')
            ->setParameter('country', $form->getData());
    }
}

标签: symfonyeasyadmin

解决方案


尝试这个:

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
// ...

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'class' => Country::class
    ]);
}

public function getParent()
{
    return EntityType::class;
}

如果要按国家/地区名称排序,可以在选项中添加自定义查询生成器:

use Doctrine\ORM\EntityRepository;
// ...

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'class' => Country::class,
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('c')
            ->orderBy('c.name', 'ASC');
        }
    ]);
}

推荐阅读