2017-08-09 56 views
-1

我需要用Doctrine編寫這個查詢。我怎樣才能使用QueryBuilder寫下來?加入兩條SELECT與Doctrine

SELECT charges.id, charges.currency, charges.total_transactions, 
charges.total_volume, charges.commission, refunds.total_payouts 
FROM 
(SELECT ...very long query...) charges 
LEFT JOIN 
(SELECT ...very long query...) refunds 
ON charges.id = refunds.id AND charges.currency = refunds.currency 
+0

您可以使用[查詢生成器](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference /查詢BUI lder.html)來創建這個查詢。 – thhan

+0

@thhan,我找不到任何有關我的情況的信息。僅用於表(實體)的SELECT,而不是來自兩個連接的SELECT。如果你知道如何做到這一點,你可以提供一個例子嗎? –

+0

你可以使用兩個先前的queryBuilder作爲你的'from'的源碼 – Veve

回答

1

您可以使用Native SQL和地圖查詢結果的實體:

use Doctrine\ORM\Query\ResultSetMapping; 

$rsm = new ResultSetMapping; 
$rsm->addEntityResult('AppBundle:Charges', 'charges') 
    ->addEntityResult('AppBundle:Refunds', 'refunds') 
    ->addFieldResult('charges', 'id', 'id') 
    ->addFieldResult('charges', 'currency', 'currency') 
    ->addFieldResult('charges', 'total_transactions', 'total_transactions') 
    ->addFieldResult('charges', 'total_volume', 'total_volume') 
    ->addFieldResult('charges', 'commission', 'commission') 
    ->addFieldResult('refunds', 'total_payouts', 'total_payouts') 
; 

$sql = " 
    SELECT 
     charges.id, 
     charges.currency, 
     charges.total_transactions, 
     charges.total_volume, 
     charges.commission, 
     refunds.total_payouts 
    FROM 
     (SELECT ...very long query...) charges 
    LEFT JOIN 
     (SELECT ...very long query...) refunds ON charges.id = refunds.id AND charges.currency = refunds.currency 
    WHERE some_field = ? 
"; 

$query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
$query->setParameter(1, $name); 
$entities = $query->getResult(); 
+0

Thx,男人。在這種情況下,我認爲這是Doctrine唯一可能的解決方案。 –

1

您可以使用DQL這樣的:

$dql = "SELECT ..."; 
$q = $entityManager->createQuery($dql)->setParameters($arrayParameters); 
$result = $q->execute(); 

QueryBuilder每個子查詢,如:

// subquery 1 
$subQuery1 = $entityManager->createQueryBuilder() 
    ->select('...') 
    ->from('...') 
    ->getDQL() 
; 
// subquery 2 
$subQuery2 = ... 
// etc 
// ... 
// main query 
$query = $entityManager->createQueryBuilder() 
    ->select('...') 
    ->from('...', $subQuery1) 
    ->leftJoin('...', $subQuery1->getDQL()), 
    ->where() 
; 

PS:我只是想爲你提供依據...希望你現在有線索...

+0

你確定使用QueryBuilder的解決方案可以工作嗎?因爲當我執行生成的查詢時,它會引發「列'SELECT'未在col 195上定義的異常」,其中主要查詢「FROM」嘗試使用subQuery1(... FROM SELECT ...)。 –

0

現在我發現這是不可能的。通過STOF創建

評論:

DQL是有關查詢的對象。在FROM子句中支持子查詢意味着DQL解析器不能再構建結果集映射(因爲子查詢返回的字段可能不再與該對象匹配)。

這就是爲什麼它不能被支持(只有在沒有水合的情況下運行查詢的情況下才支持它是一個不可行的IMO,因爲這意味着查詢解析需要依賴於執行模式)。

在你的情況,最好的解決辦法可能是運行SQL查詢,而不是(因爲你得到一個標量,你不需要反正ORM水化)

來源:https://github.com/doctrine/doctrine2/issues/3542