2016-08-08 8 views
2

DQLの通常のLEFT JOINで3つのエンティティを選択しています。それらは、結合テーブルを介して関連しており、結合テーブルには、それらのために定義されたエンティティと、注釈付きの関係もあります。 クエリは問題なく実行されますが、結果はフラットな配列として返されます。Doctrine DQL結合からフラットな配列を返します

:私はオブジェクトや配列として水和のいずれか、クエリに getResult()を呼び出すと、私はフラットな結果セットを取得

SELECT e1, e2, e3 FROM AppBundle:EntityOne 
JOIN AppBundle:JoinEntityOneWithTwo e1_2 WITH e1_2.entity1 = e1.id 
JOIN AppBundle:EntityTwo e2 WITH e1_2.entity2 = e2.id 
JOIN AppBundle:JoinEntityOneWithThree e1_3 WITH e1_3.entity1 = e1.id 
JOIN AppBundle:EntityThree e3 WITH e3.id = e1_3.entity3 
WHERE e1.some_field IN ('some','values','in','e1'); 

:私は、各インデックスの配列要素として3つのエンティティを持つ配列を期待します

array(
/AppBundle/Entity/EntityOne (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityOne (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityTwo (...), 
/AppBundle/Entity/EntityThree (...), 
/AppBundle/Entity/EntityOne (...), 
) 

Iは期待、または多次元アレイがしたい:

Array(
[0] => Array(
    [0] /AppBundle/Entity/EntityOne, 
    [1] /AppBundle/Entity/EntityTwo, 
    [2] /AppBundle/Entity/EntityThree 
), 
[1] => . . . 
) 

結果が行によって関連していません。それらをグループ化できる予測可能な順序もありません。array_chunk()

生成されたSQLは正常に動作します。 DQLは正確な結果を返す - 私が期待するように公式化されていない。私は熱心な負荷に教義(とらえどころのない)のドキュメントを、次の加入しています:

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html

この質問は

Doctrine DQL returns multiple types of entities

と非常によく似ています。しかし、私のテーブル結合が多対しているとして、私の選択順序が異なります多対多。 多くの感謝!この質問の

変異体は頼まれた:

Getting Doctrine DQL results the SQL way

私は教義が参加するテーブルを介し積極的なロードをサポートしていないことはかなり驚いています。

+0

は、あなたが選択する必要があり積極的なロードを使用するには、E1だけでなくE1、E2とe3。 – Alsatian

+0

ええ、e1はどのテーブルにも外部キー参照がありません。私は 'e1_2'を選択することで道の一部を得ることができましたが、その後、私は' e3'との関係を失います。 – eggmatters

答えて

1

は、ここで私が思い付くことができることが最善です:

//in my entity repository: 
public function getFoo($hydrate = true) { 
    $sql = "SELECT e1, e2, e3 FROM entity_one 
      JOIN entity_one_entity_two e1_2 ON e1_2.entity_one_id = e1.id 
      JOIN entity_two e2 ON e1_2.entity_two_id = e2.id 
      JOIN entity_one_entity_three e1_3 ON e1_3.entity_one_id = e1.id 
      JOIN entity_three e3 ON e3.id = e1_3.entity_three.id 
      WHERE e1.some_field IN ('some','values','in','e1')"; 
    $stmt = $con->prepare($sql); 
     $stmt->execute(); 
    return ($hydrate) 
    ? $this->hydrateResponses($stmt->fetchAll(PDO::FETCH_ASSOC)) 
     : $stmt->fetchAll(PDO::FETCH_ASSOC); 
} 

public function hyrdateResponses($responses) { 
    //call find by ids on repositories from array. 
} 

一つだけの結果を取得しようとしているときに、3XNにクエリの数を実行しているので、これは素晴らしい作品!

0

コールgetScalarResult()の代わりに、あなたのクエリにgetResult()、あなたはすべてのすべてのフィールドがテーブルに参加したでしょうが、レコードごとに1列にマージ:

# Replace this call ... 
$query->getQuery()->getResult(); 
# ... by that call ... 
$query->getQuery()->getScalarResult(); 
関連する問題