Symfony EasyAdminBundle 3 覆盖 createIndexQueryBuilder()

Nel*_*Nel 2 php symfony easyadmin

它在 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);
}
Run Code Online (Sandbox Code Playgroud)

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


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;
}
Run Code Online (Sandbox Code Playgroud)

gha*_*ano 9

这对我的 EasyAdmin 4.x 有用

use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;

class CampaignCrudController extends AbstractCrudController
{
    public function __construct(EntityRepository $entityRepository)
    {
        $this->entityRepository = $entityRepository;
    }

    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): ORMQueryBuilder
    {
        $response = $this->entityRepository->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $response->andWhere('entity.user = :user')->setParameter('user', $this->getUser());

        return $response;
    }
Run Code Online (Sandbox Code Playgroud)


Sco*_*niz 5

您所需要的只是添加entity.where 子句:)

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;
}
Run Code Online (Sandbox Code Playgroud)