2016-04-14 10 views
0

予算に割り当てられていないコストセンターを返すクエリを作成する際に問題があります。ドクトリン多対多左結合

データベースの構造:予算のコストセンターのリストに割り当てられ返すクエリを実行するために管理

**Cost_center:** 
+------+-----------+ 
| id | title | 
+------+-----------+ 
| (PK) | (VARCHAR) | 
+------+-----------+ 
\/ 
One 
to 
many 
\/ 
**Budget_operation_scope_cost_center:** 
+----------------+---------------------------+ 
| cost_center_id | budget_operation_scope_id | 
+----------------+---------------------------+ 
| (FK)   | (FK)      | 
+----------------+---------------------------+ 
\/ 
Many 
to 
one 
\/ 
**Budget_operation_scope:** 
+------+-----------+-----------+ 
| id | title | budget_id | 
+------+-----------+-----------+ 
| (PK) | (VARCHAR) | (FK)  | 
+------+-----------+-----------+ 
\/ 
Many 
to 
one 
\/ 
**Budget:** 
+------+-------+ 
| id | year | 
+------+-------+ 
| (PK) | (INT) | 
+------+-------+ 

$query = $this->getEntityManager() 
    ->createQueryBuilder() 
    ->select('costCenter') 
    ->from('ResourcesBundle:CostCenter', 'costCenter') 
    ->leftJoin('costCenter.budgetOperationScope', 'budgetOperationScope') 
    ->where('budgetOperationScope.budgetId = :budget') 
    ->setParameter('budget', $budget) 
    ->getQuery()->getResult(); 

質問:に割り当てられていないコストセンターを取得する方法予算?

+0

賢くleftJoinの第3及び第4の引数を使用する - それのための検索 – LBA

答えて

0

この行が参加する参加早すぎるクエリを制約し、効果的にあなたの左作っている:

->where('budgetOperationScope.budgetId = :budget') 

をあなたの左に移動することができますので、同じように参加:

->leftJoin('costCenter.budgetOperationScope', 'budgetOperationScope', 'WITH' 'budgetOperationScope.budgetId = :budget') 

必要になります。この方法コストセンターに予算がない場合、budgetOperationScopeのnull行を取得するようになりました。

だから、あなたが効果的に行うことができます:すべて一緒に

->where('budgetOperationScope IS NULL') 

$query = $this->getEntityManager() 
    ->createQueryBuilder() 
    ->select('costCenter') 
    ->from('ResourcesBundle:CostCenter', 'costCenter') 
    ->leftJoin('costCenter.budgetOperationScope', 'budgetOperationScope', 'WITH' 'budgetOperationScope.budgetId = :budget') 
    ->where('budgetOperationScope IS NULL') 
    ->setParameter('budget', $budget) 
    ->getQuery()->getResult(); 
関連する問題