2017-08-09 51 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