【问题标题】:Symfony EasyAdminBundle 3 override the createIndexQueryBuilder()Symfony EasyAdminBundle 3 覆盖 createIndexQueryBuilder()
【发布时间】:2020-12-05 12:02:50
【问题描述】:

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, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
    $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
    $response->where('isDeleted', true);
    return $response;
}

【问题讨论】:

  • 没有看到代码希望你也做得很好
  • 你重写了这个方法吗?我也有同样的问题。放置你的 crud 控制器代码。

标签: php symfony easyadmin


【解决方案1】:

您只需要在 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, $entityDto, $fields, $filters);
    $response->where('entity.isDeleted = 1');

    return $response;
}

【讨论】:

  • 我会说父调用是没有必要的。
  • 谢谢,正如@KaizokuGambare 评论所说,家长电话对我没有任何改变。但是,当使用 $response->where 将其设置为 $response->andWhere 时,搜索会崩溃,一切正常。
【解决方案2】:

这是一个关于如何在 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, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
{
    $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
    $response->where("entity.roles NOT LIKE '%%ROLE_SUPER_ADMIN%%'");

    return $response;
}

【讨论】:

    【解决方案3】:

    对于使用接受的答案并通过搜索找到此问题的每个人都关注 QueryException:

    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, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $response = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $response->andWhere('entity.isDeleted = 1');   
        return $response;
    }
    

    【讨论】:

    • 问题是当我们使用过滤器输入进行搜索时,出现以下错误:Too few parameters: the query defines 4 parameters but you only bound 2。如果没有 createIndexQueryBuilder 自定义,我们就没有:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多