【发布时间】:2019-10-21 12:30:52
【问题描述】:
我正在尝试选择所有在给定预订日期未被占用的房间。
我已经创建了这样的代码:
$queryBuilder->select('rm')
->from('App:Room', 'rm')
->leftJoin('App:Reservation', 'r', 'WITH', $queryBuilder->expr()->andX(
$queryBuilder->expr()->lt('r.start', '?1'),
$queryBuilder->expr()->gt('r.stop', '?2'),
$queryBuilder->expr()->neq('r.status', '?3')
)
)->where(
$queryBuilder->expr()->andX(
$queryBuilder->expr()->isNull('r')
)
)->setParameters(
array(
1 => $stop,
2 => $start,
3 => Reservation::STATUS_EXPIRED
)
);
我在 2 个房间有 2 个预订,其中房间 ID 等于预订 ID:
- 2000-01-01 - 2000-01-02
- 2000-01-01 - 2000-01-03
还有$start = '2000-01-02'和$stop = '2000-01-05',两个预订的状态都是Reservation::STATUS_NEW
我希望在给定这些日期的情况下,此查询将返回房间 1。因为房间 2 的预订与它们发生冲突,但结果为空。
删除where 子句会导致返回两个房间。在这种情况下,$queryBuilder->getQuery()->getArrayResult() 返回房间和预订号 2。正如预期的那样,但是当我恢复 where 子句时,数组只是空的。
我的另一种方法是通过子查询,但它的行为完全相同,所以请指教,我错过了什么?
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$all = $this->getEntityManager()->createQueryBuilder();
$all->select('rma.id')
->from('App:Room', 'rma')
->innerJoin('App:Reservation', 'r')
->where(
$all->expr()->andX(
$all->expr()->lt('r.start', '?1'),
$all->expr()->gt('r.stop', '?2'),
$all->expr()->neq('r.status', '?3')
)
);
$queryBuilder->select('rm')
->from('App:Room', 'rm')
->where(
$queryBuilder->expr()->neq(
'rm.id',
$queryBuilder->expr()->all(
$all->getDQL()
)
)
)->setParameters(
array(
1 => $stop,
2 => $start,
3 => Reservation::STATUS_EXPIRED
)
);
【问题讨论】:
标签: php doctrine-orm doctrine symfony4 query-builder