You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Doctrine的findBy()方法中返回数组而非对象?

在Doctrine中用类似findBy的查询返回数组(无需新建仓库方法)

嘿,刚好碰到过类似的需求!findBy()确实是个便捷的查询方法,但它默认只返回实体对象,而且没有直接的参数让你指定 hydration 模式。不过不用在仓库里新建方法,直接在调用的地方用QueryBuilder就能实现和findBy()完全一样的逻辑,同时返回数组结果。

替换你的现有查询

把原来的findBy()调用换成下面的代码,就能得到按name升序排列的数组结果:

use Doctrine\ORM\Query;

// 替代原来的findBy调用
$results = $em->getRepository('xBundle:x')
    ->createQueryBuilder('x') // 这里的'x'是实体别名,和你仓库里的命名习惯保持一致即可
    ->orderBy('x.name', 'ASC')
    ->getQuery()
    ->getResult(Query::HYDRATE_ARRAY); // 指定以数组形式返回结果

如果有查询条件怎么办?

比如你原来的findBy()是带筛选条件的,比如findBy(array('status' => 'active'), array('name' => 'ASC')),那只要在QueryBuilder里补充where条件和参数绑定就行:

$results = $em->getRepository('xBundle:x')
    ->createQueryBuilder('x')
    ->where('x.status = :status')
    ->setParameter('status', 'active')
    ->orderBy('x.name', 'ASC')
    ->getQuery()
    ->getResult(Query::HYDRATE_ARRAY);

为什么不直接转数组?

当然你也可以用findBy()拿到对象后手动转数组,比如遍历每个实体调用toArray()(如果实体自定义了这个方法)或者用get_object_vars(),但这样不仅代码更啰嗦,效率也不如直接让Doctrine返回数组高。用QueryBuilder的方式是最直接高效的,还完全不用改动仓库类。

内容的提问来源于stack exchange,提问作者Jolan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:28:15