问题描述
它在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;
}