Symfony EasyAdminBundle 3覆盖createIndexQueryBuilder

问题描述

它在EasyAdminBundle文档上说

例如,index()操作调用名为createIndexQueryBuilder()的方法来创建Doctrine查询构建器,该构建器用于获取显示在索引列表上的结果。如果您想自定义该列表,最好覆盖createIndexQueryBuilder()方法,而不要覆盖整个index()方法

因此,让我们想象一下,在删除用户时,我的用户实体中的字段isDeleted设置为true。在索引页面中,我只想显示isDeleted = false的用户。 为此,如何覆盖createIndexQueryBuilder()?

这是方法createIndexQueryBuilder


public function createIndexQueryBuilder(SearchDto $searchDto,EntityDto $entityDto,FieldCollection $fields,FilterCollection $filters): QueryBuilder
{
    return $this->get(EntityRepository::class)->createqueryBuilder($searchDto,$entityDto,$fields,$filters);
}

我试图像这样覆盖它,但是没有用


public function createIndexQueryBuilder(SearchDto $searchDto,FilterCollection $filters): QueryBuilder
{
    $response = $this->get(EntityRepository::class)->createqueryBuilder($searchDto,$filters);
    $response->where('isDeleted',true);
    return $response;
}

解决方法

您需要的是在where子句中添加entity.

public function createIndexQueryBuilder(SearchDto $searchDto,EntityDto $entityDto,FieldCollection $fields,FilterCollection $filters): QueryBuilder
{
    parent::createIndexQueryBuilder($searchDto,$entityDto,$fields,$filters);

    $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto,$filters);
    $response->where('entity.isDeleted = 1');

    return $response;
}
,

对于使用接受的答案并通过搜索找到以下内容的每个人来说:

QueryException 
Too many parameters: the query defines 1 parameters and you bound 3

EntityCrudController 中的 EasyAdmin v3.x:

  • 使用->andWhere()函数
  • 使用 entity. 作为前缀(实际上,使用“entity”,不要替换为您的实体名称)
public function createIndexQueryBuilder(SearchDto $searchDto,FilterCollection $filters): QueryBuilder
{
    $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto,$filters);
    $response->andWhere('entity.isDeleted = 1');   
    return $response;
}
,

以下是有关如何在EasyAdmin v3.x中替换DQL FILTER的示例

EasyAdmin v2.x DQL过滤器:

easy_admin:
  entities:
    User:
      class: App\Entity\User
      list:
        dql_filter: "entity.roles NOT LIKE '%%ROLE_SUPER_ADMIN%%'"

UserCrudController中的EasyAdmin v3.x:

public function createIndexQueryBuilder(SearchDto $searchDto,$filters);
    $response->where("entity.roles NOT LIKE '%%ROLE_SUPER_ADMIN%%'");

    return $response;
}