2015-09-14 21 views
0

我正在查詢生成器中工作,其目的是返回經銷商付款的排名。經銷商通過非外鍵列(affiliateCode)與客戶進行關聯,因此我需要將此聯接與依賴於此非關鍵聯接的實體列表相關聯。加入取決於第二個非相關的加入,學說2

結果我最終這樣但它不工作。雖然沒有錯誤拋出。

$queryBuilder = $this->getEntityManager()->createQueryBuilder(); 
    $queryBuilder->select('SUM(pay.value) as total_points, cli.id as client_id') 
     ->from('Application\Model\Payment', 'pay') 
     ->innerJoin('pay.subscription', 'sub') 
     ->innerJoin('sub.client', 'representative') 
     ->innerJoin(
      'representative.userCollection', 
      'seller', 
      'WITH', 
      'seller.affiliateCode = cli.affiliateCode' 
     ) 
     ->innerJoin('seller.clientCollection', 'cli') 
     ->where(
      ' 
       pay.status = :donePaymentStatus 
       AND representative.affiliateCode IS NOT NULL 
      ' 
     ) 
     ->groupBY('cli.id') 
     ->orderBY('total_points', 'DESC'); 

    $queryBuilder->setParameters([ 
     'donePaymentStatus' => PaymentStatus::DONE, 
    ]); 

如果我想要做的事不可能通過連接,你能否提出一個替代方案。也許嵌套查詢。

回答

0

你沒有得到錯誤的原因是你的語法不錯,但是你的邏輯錯誤。 INNER JOIN是您可以執行的最獨特的連接 - 它將僅返回符合所有條件的記錄。你可能會有更少的運氣和更少的獨佔連接(左或右連接)。

維恩圖的幫助:

http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

+0

如果我的內心改變加入與左非外鍵連接,我得到的結果,但在CLI實體遺失。 ''''''''''''''''''''''''''''''''''''' –

+0

您是否試圖將其從查詢構建器手中取出並將其作爲DQL查詢編寫?可能會強調一兩個問題。 – Ragdata