Symfony 使用getArrayResult访问实体方法

Symfony 使用getArrayResult访问实体方法,symfony,Symfony,我遇到性能问题,正在尝试使用return$qb->getQuery()->getArrayResult()检索数组来自我的存储库,以改进它 性能稍好一些,但我无法再访问我的自定义实体方法。。。我想这是一种正常的行为,但有没有办法克服呢 编辑: 在本地开发环境中,控制器的加载时间太长 我的控制器操作只是从我的存储库中检索一组对象,下面是代码: public function findAllForAdmin() { $qb = $this ->createQu

我遇到性能问题,正在尝试使用
return$qb->getQuery()->getArrayResult()检索数组来自我的存储库,以改进它

性能稍好一些,但我无法再访问我的自定义实体方法。。。我想这是一种正常的行为,但有没有办法克服呢

编辑:
在本地开发环境中,控制器的加载时间太长

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

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个广告。这在我看来不算什么。。。
我不知道在哪里查找…

getArrayResult
将把select的结果返回到一个数组中,因此不再可能返回您的实体

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

  • 隐式(在查询生成器级别)使它们成为
    select
    builder部分的一部分
  • 在实体属性上使用

  • 嗯,我想我设法改善了我的表现问题,答案似乎很明显

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

    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()
        ;
    }
    
    改进是巨大的。。。

    不,不是真的,除非你为你的数组创建了新的方法,所以那是一团糟。但是你有很多其他的选择,比如使用DTO,部分对象加载,避免集合的延迟加载-你的性能问题是什么?@LBA我编辑了我的帖子来添加一些信息。你是否在产品设置中尝试注销和调试,或者在一个合理的级别?是否启用了opcache?opcache已启用。我试图在这个简单的配置中提高我的性能,因为我在prod中遇到了性能问题。在显示任何内容之前,我从服务器等待的时间大约为6秒。嗯,这是我在评论中试图说的,但你提到的策略只是“黑暗中的一枪”正如我们在德国所说的,只要我们不知道OP的性能瓶颈是什么。@LBA他写了关于“水合物”和“阵列”:唯一的逻辑结果就是我在回答imho时所隔离的。当然我不能确定:)@ThEBiShOp原则检索时间似乎非常少(82毫秒),甚至页面呈现也是可以接受的:不知道哪里会丢失约700毫秒,但它似乎与查询本身没有严格的关系。顺便说一句,您确定要在单个页面上显示2K结果吗?我使用秒表确保在存储库调用时加载时间较长,我的findAllForAdmin()大约持续900毫秒。正如我上面所说的,我使用这个配置作为一个测试来提高我的性能,我可以用不同的方式显示我的结果,但我相信我可以在这个配置中改进它。“我错了吗?”主教900毫秒似乎是控制时间,而不是教义一:检查你的档案器