使用getArrayResult访问实体方法

时间:2017-03-17 11:25:26

标签: symfony

我遇到了性能问题,我正在尝试从我的存储库中使用return $qb->getQuery()->getArrayResult();检索水合物数组来改进它。

性能略好一些,但我再也无法访问我的自定义实体方法......我猜这是一种正常的行为,但有没有办法解决它?

修改
在我的本地开发环境中,我的控制器的加载时间很长 enter image description here

我的控制器操作只是从我的存储库中检索一组对象,这里是代码:

public function findAllForAdmin()
{
    $qb = $this
            ->createQueryBuilder('a')
            ->leftJoin('a.subcategory', 's')
            ->addSelect('s')
            ->leftJoin('s.category', 'c')
            ->addSelect('c')
            ->leftJoin('a.user', 'u')
            ->addSelect('u')
            ->leftJoin('a.advertpaidoptions', 'apo')
            ->addSelect('apo')
            ->leftJoin('a.photos', 'p')
            ->addSelect('p')
    ;

    return $qb
                    ->getQuery()
                    ->getArrayResult()
    ;
}

a是广告,我正在检索大约2k广告。那不是IMO ...... 我不知道在哪里看......

2 个答案:

答案 0 :(得分:0)

getArrayResult会将select的结果返回到数组中,因此不再可能拥有实体。

如果您需要获取实体的所有(或某些)信息,您可以遵循策略:

  1. 隐式(在查询构建器级别)使它们成为select构建器部分的一部分
  2. 在实体属性
  3. 上使用fetch=EAGER

答案 1 :(得分:0)

嗯,我认为我设法改善了我的表现问题,但答案似乎非常明显......

我只需加载我需要的字段,而不是加载整个实体......

public function findAllForAdmin()
{
    $qb = $this
            ->createQueryBuilder('a')
            ->select(array(
                'a.id',
                'a.dateCreate',
                'a.title',
                'a.price',
                'a.price_type',
                'a.completed',
                'a.deleted',
                'a.slug',
            ))
            ->leftJoin('a.subcategory', 's')
            ->addSelect('s.slug AS s_slug')
            ->leftJoin('s.category', 'c')
            ->addSelect('c.slug AS c_slug')
            ->leftJoin('a.user', 'u')
            ->addSelect('u.username')
            ->leftJoin('a.advertpaidoptions', 'apo')
            ->addSelect('COUNT(apo.id) AS nb_apo')
            ->leftJoin('a.photos', 'p')
            ->addSelect('COUNT(p.id) AS nb_p')
            ->groupBy('a.id')
    ;

    return $qb
                    ->getQuery()
                    ->getResult()
    ;
}

改善很大...... enter image description here