2017-09-13 3 views
0

このプロジェクトではZend Framework 3Doctrine2を使用しています。ネストされたDoctrineエンティティの掲載結果を向上させる方法

私はツリー構造のように構築された入れ子のエンティティを持っています。ステータスは、完成のために完成していないために1または2であることを例えば単純化する -

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

すべてWorkOrderItemはステータスがあります。私は今、そうのようなパーセントをすべて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件のプロジェクトが完全にレンダリングされたビューまでのロード時のリストを表示する非常に高い - 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から直接あなたの合計数を取得しないのはなぜ

答えて

1

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 
関連する問題