2017-08-16 75 views
0

我不想做任何特殊的魔術,只需將我的查詢加入子查詢。我已經嘗試了很多在互聯網上找到的方法和技巧,但沒有人能夠工作,而且我總是收到無用的錯誤消息,這些消息告訴我們對問題有意義或者沒有意義尋找解決方案。如何在教條中左加入子SELECT

這裏是我的子查詢和查詢:

$subQuery = $qb 
      ->select("DISTINCT TRIM(cp.originalteilenummer) AS productCode") 
      ->from(\Vendor\ShopBundle\Entity\ExternalProduct::class, 'cp') 
      ->getQuery(); 


$result = self::$entityManager->createQueryBuilder() 
      ->select('c.id, 
         c.manufacturerId, 
         cu.fullName, 
         c.vin, 
         c.plateNumber, 
         c.netDiscountPrice, 
         c.calculationDate, 
         u.loginName, 
         c.lastOfferSentAt, 
         COUNT(DISTINCT i.id) AS items, 
         c.customerDmsId, 
         GROUP_CONCAT(cp.productCode) AS productCodes') 
      ->from(\Vendor\ShopBundle\Entity\Calculation::class, 'c') 
      ->innerJoin(\Vendor\ShopBundle\Entity\CalculationItem::class, 'i', 'WITH', 'c.id = i.orderId') 
      ->leftJoin(\Vendor\UserBundle\Entity\User::class, 'u', 'WITH', 'c.openedBy = u.id') 
      ->leftJoin(\Vendor\CoreBundle\Entity\User::class, 'cu', 'WITH', 'c.customerDmsId = cu.user') 
      ->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode') 
      ->groupBy('c.id') 
      ->getQuery() 
      ->getScalarResult(); 

我只是想離開加入我的查詢子查詢的數據集。我怎麼能做到這一點?

如果我跑,我得到一個錯誤:你正在嘗試做的

[Semantical Error] line 0, col 773 near '(SELECT DISTINCT': Error: Class '(' is not defined.

+0

@Veve是的,它工作得很好 – ACs

+0

花點時間學習的DQL(不SQL)聯接語法。提示:leftJoin(c.openBy','u')是你所需要的。獲取基礎知識,然後專注於您的子查詢。 – Cerad

+0

@Cerad沒有子查詢基本查詢正常工作。正如你所說的離開加盟(c.openBy','u')就足夠了,但只有當'c'和'u'之間有聯繫時,但在這種情況下並不存在。使用我使用的語法,可以通過給定的條件連接兩個'不相關'的實體。所以問題仍然是這個學說絕對期望一個實體類在我想要傳遞子查詢的地步。 – ACs

回答

0

這應該工作,你正試圖把getSQL()改用getDQL()

->leftJoin(sprintf('(%s)', $subQuery->getSQL()), 'cp', 'WITH', 'i.partNumber = cp.productCode') 
當然

->leftJoin('VendorShopBundle:ExternalProduct', 'cp', 'WITH', $qb->expr()->eq('i.partNumber', '('.$subQuery->getDQL().')'))