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毫秒似乎是控制时间,而不是教义一:检查你的档案器