ApiPlatform:CustomSearchFilter:doctrine为andWhere生成了一个子请求。
创始人
2024-09-08 02:30:32
0

当使用ApiPlatform时,可以自定义搜索过滤器来实现自定义搜索逻辑。有时,使用Doctrine的andWhere方法生成的查询会导致额外的子请求,这可能会影响性能。以下是解决这个问题的代码示例:

首先,创建一个自定义搜索过滤器类,继承自ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter

use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\AbstractContextAwareFilter;
use Doctrine\ORM\QueryBuilder;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\RequestStack;

class CustomSearchFilter extends AbstractContextAwareFilter
{
    private $logger;

    public function __construct(RequestStack $requestStack, LoggerInterface $logger = null, array $properties = null)
    {
        parent::__construct($requestStack, $properties);
        $this->logger = $logger;
    }

    /**
     * Applies the filter on the query builder.
     *
     * @param QueryBuilder $queryBuilder
     * @param string $property
     * @param mixed|null $value
     * @param string $context
     */
    protected function filterProperty(QueryBuilder $queryBuilder, $property, $value, $context = null)
    {
        if (null === $value || !$this->isPropertyEnabled($property)) {
            return;
        }

        $alias = $queryBuilder->getRootAliases()[0];
        $field = sprintf('%s.%s', $alias, $property);

        $parameterName = $this->createAlias($property);

        $queryBuilder
            ->andWhere(sprintf('%s = :%s', $field, $parameterName))
            ->setParameter($parameterName, $value);
    }

    /**
     * Gets the description of this filter for the given resource.
     *
     * @param string $resourceClass
     * @return array
     */
    public function getDescription(string $resourceClass): array
    {
        // Return an empty array or add some custom description for your filter
        return [];
    }
}

然后,在你的实体类中使用@ApiFilter注解来应用自定义搜索过滤器:

use ApiPlatform\Core\Annotation\ApiFilter;
use App\Filter\CustomSearchFilter;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiFilter(CustomSearchFilter::class, properties={"name": "exact"})
 * @ORM\Entity()
 */
class YourEntity
{
    // ...
}

最后,在你的服务配置中注册自定义搜索过滤器:

services:
    App\Filter\CustomSearchFilter:
        autowire: true
        autoconfigure: true

现在,自定义搜索过滤器将在查询构建器中使用andWhere方法生成查询条件,而不会引发额外的子请求。

相关内容

热门资讯

两分钟了解!蜀山四川麻将有挂吗... 两分钟了解!蜀山四川麻将有挂吗,大宝麻将辅助器app,可靠技巧(有挂辅助);1、该软件可以轻松地帮助...
两分钟了解!衢州都莱辅助器,牌... 两分钟了解!衢州都莱辅助器,牌乐门手机麻将有什么,2025新版技巧(有挂技巧)1、下载好牌乐门手机麻...
五分钟了解!福建十三水软件开发... 五分钟了解!福建十三水软件开发,八闽十三张软件,AI教程(有挂普及)1、超多福利:超高返利,海量正版...
6分钟了解!途乐棋牌这个平台靠... 6分钟了解!途乐棋牌这个平台靠谱吗,中至麻将可以设置输赢吗,必赢方法(有挂脚本)1、操作简单,无需注...
四分钟了解!快玩炸翻天辅助器,... 四分钟了解!快玩炸翻天辅助器,星悦广东麻将有没有挂,普及教程(有挂揭秘)1、星悦广东麻将有没有挂系统...
九分钟了解!掌酷十三张系统规律... 九分钟了解!掌酷十三张系统规律,掌电竞技真的能赢吗,大神讲解(有挂揭秘);1、玩家可以在掌电竞技真的...
9分钟了解!蛮籽重庆麻将有没有... 9分钟了解!蛮籽重庆麻将有没有挂,八闽十三张有外挂吗,必胜教程(有挂解密)1、上手简单,内置详细流程...
8分钟了解!微信牵手跑得快小程... 8分钟了解!微信牵手跑得快小程序辅助器免费,牌乐门如何拿到好牌,技巧教程(有挂透明);1、每一步都需...
两分钟了解!老友游戏辅助器,财... 两分钟了解!老友游戏辅助器,财神13张 辅助器,2025新版教程(有挂工具)财神13张 辅助器辅助器...
二分钟了解!新玉海楼茶苑有没有... 二分钟了解!新玉海楼茶苑有没有外 挂,牵手互娱有挂吗,详细教程(有挂普及)小薇(透视辅助)致您一封信...