2016-05-03 21 views
1

まず上で動作し、ここで私が持っているものです。symfonyの教義の関係もパーシャルはすべてのDQL

DeviceContentUpdateエンティティ:

Bundle\Entity\DeviceContentUpdate: 
    type: entity 
    table: device_content_updates 
    repositoryClass: ... 
    id: 
     id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
    fields: 
     ... 
     deviceId: 
     type: integer 
     column: device_id 
     nullable: true 
    manyToOne: 
     relDevice: 
     targetEntity: Device 
     inversedBy: relDeviceContentUpdates 
     joinColumn: 
      name: device_id 
      referencedColumnName: id 

デバイスエンティティ:

Bundle\Entity\Device: 
    type: entity 
    table: devices 
    repositoryClass: ... 
    id: 
    id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
    fields: [...] 
    oneToMany: 
    relDeviceContentUpdates: 
     targetEntity: DeviceContentUpdate 
     mappedBy: relDevice 

今私がQueryBuilderを使用してIDで項目を1つ取得しようとすると、適切なJOIN caluseを構築できないtは多対1の関係の場合にすべてのレコードを結合します。

例1

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt') 
    ->leftJoin('Bundle:Device', 'd') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); 

結果1:デバイスエンティティのテーブルにある限り多くの項目でDeviceContentUpdate項目のリスト。

予想結果1:relDevice()メソッドでアクセス可能な関連デバイスアイテムを含む1つのDeviceContentUpdateアイテムのリスト。私はjoin節なしでオブジェクトをフェッチでき、遅延ローダーを使用できることを知っています。これは状況を説明するためのものです。

例2例1つの

例から予想される結果3:2

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt') 
    ->leftJoin('Bundle:Device', 'd', 'WITH', 'd.id = mt.deviceId') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); 

結果

$result = $deviceContentUpdateRepository 
    ->createQueryBuilder('mt') 
    ->select('mt, partial d.{id,name}') 
    ->leftJoin('Bundle:Device', 'd', 'WITH', 'd.id = mt.deviceId') 
    ->where('mt.id = ?0') 
    ->setParameter(0, $id) 
    ->getQuery()->getResult(); // mode HYDRATE_OBJECT 

結果3:2つのアイテムのリスト、0アイテムはDeviceContentUpdate、1アイテムはデバイスのプロキシです。

期待される結果3:1つのDeviceContentUpdateアイテムのリスト。

私は本当に混乱しています。すべてのマニュアルと例では、FOだけがマップされている場合はJOIN句にWITHを使用する理由はないと言いますが、私の場合は、また、私は部分的に頭からすべての私の髪を取り除いています。文字通りこの振る舞いについては分かりません。

答えて

2

この例を試してみてください。

$query = $em->createQueryBuilder() 
    ->from('Embed', 'e') 
    ->select("e") 
    ->leftJoin("User", "u", "WITH", "e.uid=u.id") 
    ->leftJoin("Product", "p", "WITH", "e.pid=p.id") 
    ->where("u.image > 0 OR p.image > 0") 
    ->addOrderBy("COALESCE(u.timeCreated, p.timeCreated)", "DESC") 
    ->setMaxResults(28) 
    ->getQuery(); 

ありがとうございます。

+0

トピックに関連するものはありません。 -1:/ – David

関連する問題