2017-08-09 1 views
-1

Doctrineでこのクエリを書く必要があります。 QueryBuilderを使ってどのように書き留めることができますか?Doctrineで2つのSELECTに参加する

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/query-bui lder.html)を使用してこのクエリを作成します。 – thhan

+0

@thhan、私は私の場合のための情報を見つけることができません。テーブル(エンティティ)からのSELECTに対してのみであり、結合された2つのSELECTからのものではありません。これを行う方法がわかっている場合は、例を挙げることができますか? –

+0

あなたは 'from'のソースとして以前の2つのqueryBuilderを使うことができます – 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、man。この場合、これが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'で解決できることは確かですか?なぜなら、生成されたクエリを実行すると、 "CL 'SELECT'が列195で定義されていないという例外がスローされるからです。"メインクエリ "FROM"がsubQuery1(... FROM SELECT ...) –

0

今私はそれが不可能であることを知った。 STOFによって作成された

コメント:

DQLは、オブジェクトを照会についてです。 FROM句の副選択をサポートすることは、DQLパーサが結果セットのマッピングをもう作成できないことを意味します(サブクエリによって返されるフィールドがオブジェクトとこれ以上一致しない可能性があるため)。

これはサポートできません(水分補給なしでクエリを実行した場合にのみサポートされます。これは、クエリ解析が実行モードに依存している必要があるためです)。あなたのケースでは

、最善の解決策ではなく、SQLクエリを実行するために、おそらくです(あなたがスカラーを得ているとして、あなたはとにかくORMの水和を必要としない)

出典:https://github.com/doctrine/doctrine2/issues/3542

関連する問題