まず上で動作し、ここで私が持っているものです。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を使用する理由はないと言いますが、私の場合は、また、私は部分的に頭からすべての私の髪を取り除いています。文字通りこの振る舞いについては分かりません。
トピックに関連するものはありません。 -1:/ – David