指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

symfony之doctrine添加查询结果处理的额外拓展:

场景:现在需要把查询到的结果集,直接返回匹配到的数据的id数组,可以通过下面的方式实现

  • 在 App\Extensions\DoctrineHydrators 目录下创建如下类:
<?php

namespace App\Extensions\DoctrineHydrators;

use Doctrine\DBAL\Exception;
use Doctrine\ORM\Internal\Hydration\AbstractHydrator;

class PluckHydrator extends AbstractHydrator
{
    public const HYDRATE_PLUCK = 'hydrate_pluck';

    /**
     * @return list<mixed>
     */
    protected function hydrateAllData(): array
    {
        try {
            $pluckValues = $this->statement()->fetchFirstColumn();
        } catch (Exception $e) {
            return [];
        }

        return $pluckValues;
    }
}
  • 将 PluckHydrator 配置到 doctrine.yaml 文件里
doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '13'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App
        #添加下面这行配置即可        
        hydrators:
            hydrate_pluck: App\Extensions\DoctrineHydrators\PluckHydrator
  • 使用
return $this->createQueryBuilder("c")
            ->getQuery()
            ->getResult(PluckHydrator::HYDRATE_PLUCK); //这样就可以通过自定义模式返回想要的数据,不需要先返回结果集,再去处理得到想要的数据