2016-04-14 48 views
0

Bütçeye atanmamış maliyet merkezlerini döndürmesi gereken bir sorgu oluşturmakla ilgili bir sorunum var.Doctrine çok soldan çok üye ol

Veritabanı yapısı: bütçe maliyeti merkezleri listeye atanan döndürür bir sorgu yapmak Yönetilen

**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(); 

Soru: atanmamış maliyet merkezlerini, nasıl bütçe?

+0

akıllıca leftJoin üçüncü ve dördüncü argümanı kullanmak - arama bunun için – LBA

cevap

0

Bu çizgi çok erken Sorgunuzla kısıtlayıcı ve etkin sizin bir katılmak katılmak sol yapıyor:

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

Sen şöyle katılmak sol içine taşıyabilirsiniz:

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

Bu şekilde olacak Artık bir maliyet merkezinde bütçe bulunmadığında budgetOperationScope için boş satırlar olsun.

Böylece etkili yapabilirsiniz:

->where('budgetOperationScope IS NULL') 

Hep birlikte:

$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();