php - 如何提高列出嵌套 Doctrine 实体的性能

标签 php mysql zend-framework doctrine

我在此项目中使用 Zend Framework 3Doctrine2

我有一个嵌套实体,其构建方式类似于树层次结构。

[Project] 1 - n [WorkOrders] 1 - n [WorkOrderItems]

每个 WorkOrderItem 都有一个状态 - 为了简化示例,状态可以是 1 表示未完成,2 表示完成。我现在想通过迭代所有 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;

当显示 50 个项目的列表时, View 完全呈现之前的加载时间非常长 - 7 到 9 秒之间。在没有进度的情况下渲染列表时,渲染时间显着缩短 - 介于 0.5 到 2 秒之间。

我尝试为项目使用自定义 DQL 并在 select 语句中加入所需的数据,如下所示:

$queryBuilder = $entityManager->createQueryBuilder();

    $queryBuilder
        ->select(['p', 'o', 'oi'])
        ->from(Project::class, 'p')
        ->join('p.orders', 'o')
        ->join('o.orderItems', 'oi')
        ->groupBy('p');

这并没有给我带来明显的性能提升。

最佳答案

为什么不直接从 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

关于php - 如何提高列出嵌套 Doctrine 实体的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46196968/

相关文章:

java - Spring的JdbcDaoSupport(使用MySQL Connector/J)执行添加FK的sql后失败

java - 为 RESTful web 服务设置 MySQL 和 Apache

php - Zend 框架 2

php - 将 PHP 中的 mySQL 语句的二进制变量转换为十六进制表示形式

php - 为什么一些编码指南会更改 PHP if/else 中的条件顺序?

php - 从 MySQL 中选择 - 只有姓氏的首字母

php - Zend 框架 "under maintenance"页面

php - javascript/php 的路径问题

php - 这些方法之间有什么区别,哪种方法可以正确检查 NULL?

php - 使用 PHP、Zend 和 openssl 对 PDF 进行数字签名