【问题标题】:How I create a nested query with Laravel collection如何使用 Laravel 集合创建嵌套查询
【发布时间】:2019-11-03 10:46:00
【问题描述】:

我正在使用 Laravel 6。 我有一个创建会议的表格。我想创建一个自定义验证器来检查当时房间是否已经被占用。查询参数为“room”、“date_meeting”、“start”和“end”。

换句话说,我想用 Laravel 进行以下 MySQL 查询:

SELECT * 
FROM `meetings` 
WHERE id_room = 1 AND date = '2021-03-02' AND ((start_hour >= '22:00:00' AND start_hour < '23:00:00') OR (start_hour < '22:00:00' AND end_hour >= '23:00:00') OR (end_hour > '22:00:00' AND end_hour <= '23:00:00'))

我用 Laravel 创建了以下查询,但它不能正常工作:

public function passes($attribute, $value)
{
    $meetings = DB::table('meetings')
    ->where('id_room', request('room'))
    ->where('date', request('date_meeting'))
    ->where(function ($query) {
        $query->where('start_hour', '>=', request('start'))
        ->where('start_hour', '<', request('end'));
    })
    ->orWhere(function ($query) {
        $query->where('start_hour', '<', request('start'))
        ->where('end_hour', '>=', request('end'));
    })
    ->orWhere(function ($query) {
        $query->where('end_hour', '>', request('start'))
        ->where('end_hour', '<=', request('end'));
    })
    ->get();

    if(count($meetings) > 0) {
        return false;
    } else {
        return true;
    }
}

房间和日期在 Laravel 中可以正常工作...但是时间不能正常工作。 你知道为什么它不能正常工作吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    因为您的orWhere 查询与where('id_room', request('room')) 处于同一级别

    您需要添加两级嵌套查询,如下所示:

    $meetings = DB::table('meetings')
        ->where('id_room', request('room'))
        ->where('date', request('date_meeting'))
        ->where(function ($query) {
            $query->where(function($sub_q) {
                      $sub_q->where('start_hour', '>=', request('start'))
                            ->where('start_hour', '<', request('end'));
                  })
                  ->orWhere(function($sub_q) {
                      $sub_q->where('start_hour', '<', request('start'))
                            ->where('end_hour', '>=', request('end'));
                  })
                  ->orWhere(function($sub_q) {
                       $sub_q->where('end_hour', '>', request('start'))
                             ->where('end_hour', '<=', request('end'));
                  });
        })->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多