Symfony Doctrine数组结果的扁平化数组结果

9

通过仓库我得到了一个数组结果(每个数组是一个实体对象),如下:

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);

我的解决方案可以工作,但是否有更好的方法来获得这个结果?

4个回答

21

一旦您获得标识符数组 [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
    ...
)

1
现在可以使用: $query->getSingleColumnResult() 或 $query->getResult(AbstractQuery::HYDRATE_SCALAR_COLUMN) - KicksheepSon

1
你得到的结果:
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();

这将给你一个你期望的数组。

它将返回一个数组 [0 => ['id' => 1], 1 => ['id' => 6], 2 => ['id' => 26] ...],因此仍需要使用 array_map - user2554865
你试过使用 getScalarResult 而不是 getArrayResult 吗?我编辑了一个答案。 - Tomasz Madeyski
是的,getScalarResult 会返回与 getArrayResult 相同的数组。 - user2554865
这种方法更好,因为它避免了不必要的对象实例化。 - Gerry
1
scalarResult将给我一个关联数组。但不是预期或希望的结果。当我将您的解决方案与yonel的答案结合起来,得到了我的期望结果。 - goldlife
这个不起作用:在我的情况下,它返回一个数组的数组。 - Nico Haase

0

要做你想要的事情,现在你可以简单地使用:

$qb->getSingleColumnResult()

返回一个数值数组,其中包含每个列的值(省略列名等)

根据用户KicksheepSon评论所述


-1

最佳实践是使用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;
}

这个不起作用:在我的情况下,它返回一个数组的数组。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接