[英]How to increase performance for listing nested Doctrine entities
I am using Zend Framework 3
and Doctrine2
in this project. 我在这个项目中使用Zend Framework 3
和Doctrine2
。
I have a nested entity which is build like a tree hierarchy. 我有一个嵌套的实体,它的构建像树的层次结构。
[Project] 1 - n [WorkOrders] 1 - n [WorkOrderItems]
Every WorkOrderItem
has a status - to simplify for the example that status can be 1 for not finished or 2 for finished. 每个WorkOrderItem
都有一个状态-为了简化示例,状态可以为1(未完成)或2(已完成)。 I now want to display the progress of the project by iterating over all WorkOrderItems
and calculate the percent like so: 我现在想通过遍历所有WorkOrderItems
来显示项目的进度,并像这样计算百分比:
$finishedWorkOrderItems = 0;
$totalWorkOrderItems = 0;
foreach ($this->getWorkOrders() as $workOrder) {
foreach ($workOrder->getWorkOrderItems() as $workOrderItem) {
if ($workOrderItem->getStatus() == WorkOrderItem::STATUS_FINISHED) {
$finishedWorkOrderItems++;
}
$totalWorkOrderItems++;
}
}
return 100 / $totalWorkOrderItems * $finishedWorkOrderItems;
When displaying a list of 50 Projects the loadtime until the View is completely rendered is very high - between 7 and 9 seconds. 当显示50个项目的列表时,直到完全渲染视图为止的加载时间非常长-7到9秒之间。 When rendering the list without the progress the render time is significantly lower - between 0.5 and 2s. 如果不进行进度渲染列表,则渲染时间会大大减少-在0.5到2秒之间。
I tried to use a custom DQL
for the project and join the needed data in the select statement like so : 我试图为该项目使用自定义DQL
,并在select语句中加入所需的数据,如下所示:
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder
->select(['p', 'o', 'oi'])
->from(Project::class, 'p')
->join('p.orders', 'o')
->join('o.orderItems', 'oi')
->groupBy('p');
Which gave me no measurable performance boost. 这并没有给我带来可衡量的性能提升。
Why not get your total count directly from DQL instead of a nested loop 为什么不直接从DQL而不是嵌套循环获取总数
SELECT p,
COUNT(DISTINCT o.id) AS totalOrders,
COUNT(oi.id) AS totalOrdersItems,
SUM(CASE WHEN oi.status = 'some status' THEN 1 ELSE 0 END) AS totalWorkedOrdersItems
FROM Bundle\Entity\Project p
LEFT JOIN p.orders o
LEFT JOIN o.orderItems oi
GROUP BY p.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.