抽象类的奏鸣曲管理员:如何按子类属性过滤

Posted

技术标签:

【中文标题】抽象类的奏鸣曲管理员:如何按子类属性过滤【英文标题】:Sonata Admin for abstract class: How to filter by subclass property 【发布时间】:2019-09-12 16:14:49 【问题描述】:

我的抽象实体有一个 Sonata Admin Class。在列表视图中,我列出了两个子实体(客户、员工)。我可以通过抽象类属性(即:电子邮件)过滤它们。效果很好。

但是我如何添加一个具有子实体属性的选择(或任何)过滤器?在此示例中,我想按客户端->城市进行过滤。

在我看来这是一个常见问题,但我还没有找到任何解决方案。


// parent class
abstract class Person 
 $email;
  ...


// child class
class Client extends Person 
 $city;
  ...


// child class
class Employee extends Person 
  ...



class PersonAdmin extends AbstractAdmin


  protected function configureDatagridFilters(DatagridMapper $datagridMapper)
  
        $datagridMapper
            ->add('email')
            ->add('city'); // throw an error as it doesn't exist in the class Person
  

...

【问题讨论】:

你找到解决办法了吗? @abdiel 是的,我找到了,但我不确定它是否是最好和最干净的解决方案。我是通过 orm_callback 完成的 【参考方案1】:

我不知道这是否是最好的解决方案,但它对我有用

$city = myFunctionToGetAllCities();

$datagridMapper
    ...
    ->add('city', 
        'doctrine_orm_callback', 
        [ 
            'callback' => function($queryBuilder, $alias, $field, $value) 
                if (!$value['value']) 
                    return;
                

                $queryBuilder
                    ->Join('App\Entity\Client', 'C', 'WITH', $alias . '.id = C.id')
                    ->andWhere('C.city = :cityId')
                    ->setParameter(': cityId', $value['value']);
                return true;
            
        ],
        ChoiceType::class,
        ['choices' => $cities]
    )
    ...

【讨论】:

以上是关于抽象类的奏鸣曲管理员:如何按子类属性过滤的主要内容,如果未能解决你的问题,请参考以下文章

JAVA抽象类的定义与使用

抽象类的具体说明

类,接口,抽象类总结

如何将hibernate注解应用于抽象类的子类

java面试题总结

将抽象类和子类保存到数据库