抽象类的奏鸣曲管理员:如何按子类属性过滤
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]
)
...
【讨论】:
以上是关于抽象类的奏鸣曲管理员:如何按子类属性过滤的主要内容,如果未能解决你的问题,请参考以下文章