如何在doctrine查询构建器中一起使用andWhere和orWhere

时间:2017-11-28 15:19:43

标签: sql symfony doctrine-orm

我试图在其他地方找到答案,但不能,但似乎我的查询有效,但没有返回预期的结果。

我需要运行检查以确定日期和时间集是否与表中的现有记录重叠。所以,我选择日期和时间并检查日期是否匹配,如果匹配,如果选择的时间落在表格中的时间之间。

这是表格中的示例条目:

| id | booking_date | start_time | end_time |
---------------------------------------------
|  1 | 2017-11-26   |  11:00     |  13:00   |
---------------------------------------------

我在表格中输入日期2017-11-27,时间为11:00 - 13:00。从技术上讲,这个DOESN&T; T重叠,因为表中的日期是第26个。

这是我的Doctrine查询:

$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('COUNT(b.id)')
    ->from('AppBundle:Booking', 'b')
    ->where('b.bookingDate = :date')
    ->andWhere('b.startTime BETWEEN :start AND :end')
    ->orWhere('b.startTime = :start')
    ->orWhere('b.endTime BETWEEN :start AND :end')
        ->setParameter('date', $date)
        ->setParameter('start', $start)
        ->setParameter('end', $end)
;

return $qb->getQuery()->getSingleScalarResult();

但由于某种原因,这总是返回一个计数1.检查实际的SQL似乎OR语句没有嵌套在AND中,所以它检查是否传递的日期在表中或者时间匹配(他们这样做)而不是日期匹配并且startTime与所选startTime相同或endTime位于两者之间。

如何编写查询以包含此内容?

1 个答案:

答案 0 :(得分:2)

与此相似

match_id    team_id     matches.date    teams_att.date      overall_rating
1           101         2012-05-17      2012-02-20          73
2           101         2014-07-11      2014-09-10          74
3           102         2010-05-21      2015-03-21          42
4           102         2017-10-24      2016-03-22          44