如何在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
相关产品推荐
相关产品推荐

