象征主义的关系和偏袒都不适用于DQL



首先,这里是我所拥有的:

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();

谢谢。

相关内容

  • 没有找到相关文章

最新更新