为了账号安全,请及时绑定邮箱和手机立即绑定

Symfony EasyAdminBundle 3 重写 createIndexQuer

Symfony EasyAdminBundle 3 重写 createIndexQuer

PHP
狐的传说 2023-10-15 14:49:19
EasyAdminBundle 文档上说例如,index() 操作调用名为 createIndexQueryBuilder() 的方法来创建用于获取索引列表上显示的结果的 Doctrine 查询构建器。如果您想自定义该列表,最好重写 createIndexQueryBuilder() 方法而不是整个 index() 方法。因此,让我们想象一下,当用户被删除时,我在用户实体中将字段 isDeleted 设置为 true。在索引页面中,我想仅显示 isDeleted = false 的用户。如何为此目的重写 createIndexQueryBuilder() ?这是方法 createIndexQueryBuilderpublic 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;}
查看完整描述

4 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

您所需要的只是在 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;

}


查看完整回答
反对 回复 2023-10-15
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

这对我的 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;

    }


查看完整回答
反对 回复 2023-10-15
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

EasyAdmin4解决方案


注意:关键字(别名)entity很重要


use Doctrine\ORM\QueryBuilder;


class ArticleCrudController extends AbstractCrudController

{

     ...


     public function configureFields(string $pageName): iterable

     {

          return [

                ...

                AssociationField::new('author')->setQueryBuilder(

                fn (QueryBuilder $queryBuilder) => $queryBuilder

                   ->leftJoin('entity.article', 'a')

                   ->andWhere('entity.isActive = 1')

                   ->andWhere('a.author is NULL')

                  ),

                ...

            ]

      }


      ...

}


查看完整回答
反对 回复 2023-10-15
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

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


QueryException 

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

EntityCrudController 内的 EasyAdmin v3.x:


使用->andWhere()函数

使用实体。作为前缀(实际上,使用“实体”,不要替换为您的实体名称)

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;

}


查看完整回答
反对 回复 2023-10-15
  • 4 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信