首先,这里是我所拥有的:
DeviceContentUpdate实体:
BundleEntityDeviceContentUpdate:
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
设备实体:
BundleEntityDevice:
type: entity
table: devices
repositoryClass: ...
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields: [...]
oneToMany:
relDeviceContentUpdates:
targetEntity: DeviceContentUpdate
mappedBy: relDevice
现在,当我尝试使用QueryBuilder通过id获取一个项时,它无法构造正确的JOIN caluse,这意味着它在多对一关系的情况下连接所有记录。
示例1:
$result = $deviceContentUpdateRepository
->createQueryBuilder('mt')
->select('mt')
->leftJoin('Bundle:Device', 'd')
->where('mt.id = ?0')
->setParameter(0, $id)
->getQuery()->getResult();
结果1:DeviceContentUpdate项的列表,其项数与设备实体的表中的项数相同。
预期结果1:包含一个DeviceContentUpdate项的列表,包括relDevice()方法可访问的相关Device项。我知道我可以在没有联接子句的情况下获取对象,并使用惰性加载器,这只是为了说明情况。
示例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();
结果2:示例1的预期结果
示例3:
$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:两项列表,0项为DeviceContentUpdate,1项为Device的代理。
预期结果3:一个DeviceContentUpdate项的列表。
我真的很困惑,因为所有的手册和例子都说,如果只映射了FK,就没有理由在JOIN子句中使用WITH,但在我的情况下,如果我不使用它,它会连接所有的东西。而且,我会用分部把所有的头发都剪掉。根本不知道这种行为。
你应该试试这个,这个例子很管用。
$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();
谢谢。