使用存储库,我得到了一个数组结果(每个数组都是一个实体对象),如下所示:
array(
0 => object of type entity,
1 => another object of type entity,
2 => another object of type entity,
)
每个对象都有一些属性,如id和name等。但是我想要的是只用每个对象的id来平整整个数组
我想要的是这个(仅用ID平坦数组):
Array
(
[0] => 1
[1] => 6
[2] => 23
)
我的解决方案:
$ids = array_map($transform = function($entity) {
if ($entity instanceof Entity) {
return $entity->getId();
}
}, $myGreatDbResult);
我的解决方案是工作,但有没有更好的方法来得到这个结果?
一旦您获得了标识符[0 => ['id' => 1], 1 => ['id' => 6], 2 => ['id' => 26] ...]
的数组,您必须使用array_column
函数从输入数组中的单个列中获取值:
$ids = array_column($result, 'id');
输出:从PHP 5.5.0开始
Array
(
[0] => 1
[1] => 6
[2] => 23
...
)
您得到的结果:
array(
0 => object of type entity,
1 => another object of type entity,
2 => another object of type entity,
)
可能是findBy()
或getResult()
方法的结果。要实现您想要的效果,您需要创建自己的查询,并执行如下操作:
$result = $entityManager->createQueryBuilder()
->from('AcmeDemoBundle:Entity', 'e') //your entity
->select('e.id') //your id field
->getQuery()
->getScalarResult();
这会给你你想要的数组
现在你可以简单地使用
$qb->getSingleColumnResult()
返回每个列值(省略列名等)的数字数组
根据KicksheepSon用户的评论
最佳实践是使用symfony本地方法,正如Tomasz Madeyski所说,使用
...->getQuery()->getScalarResult()
你也可以这样做
->getQuery()->getResult('Doctrine'ORM'Query::HYDRATE_ARRAY)
一个好的做法是将方法创建到存储库类中,并通过提供两种类型的选择使其混合,例如:。
public function findAll($hydratedArray = false)
{
$query = $this ->createQueryBuilder('p')
->leftJoin('p.company', 'c')
->select('p')
->orderBy('c.name', 'ASC');
$result = $hydratedArray ? $query
->leftJoin('p.series', 's')
->leftJoin('s.variety', 'v')
->addSelect('c', 's', 'v')
->getQuery()
->getResult('Doctrine'ORM'Query::HYDRATE_ARRAY) // or getScalarResult()
: $query->getQuery()->getResult();
return $result;
}