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); //这样就可以通过自定义模式返回想要的数据,不需要先返回结果集,再去处理得到想要的数据
