Symfony原则阵列结果的平坦化阵列结果

n1bvdmb6  于 2022-11-16  发布在  其他
关注(0)|答案(4)|浏览(143)

使用存储库,我得到了一个数组结果(每个数组都是一个实体对象),如下所示:

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

我的解决方案是可行的,但是否有更好的方法来获得此结果?

odopli94

odopli941#

一旦得到了标识符[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
    ...
)
wh6knrhe

wh6knrhe2#

您得到的结果:

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

这将为您提供所需数组

nnt7mjpx

nnt7mjpx3#

要执行您想要的操作,现在只需使用

$qb->getSingleColumnResult()

它返回一个包含每个列值的数字数组(省略列名等)
根据用户KicksheepSon的注解

gv8xihay

gv8xihay4#

最好的做法是使用symfony原生方法,所以正如Tomasz Madeyski所说,使用

...->getQuery()->getScalarResult()

您也可以通过执行以下操作来实现

->getQuery()->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY)

一个好的做法是创建方法INTO存储库类,并通过提供两种类型的选择使其混合,例如:。

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

相关问题