Добавление операторов OR в красноречивые запросы - PullRequest
1 голос
/ 16 июня 2020

Мне нужна небольшая помощь относительно синтаксиса Eloquent. Я хочу добавить больше предложений where, но не могу заставить OR работать. Я прочитал https://laravel.com/docs/7.x/queries#where -предложения , но мой оператор не работает.

Работает:

$events = DB::table('events')->select('id','resourceId','title','start','end')
  ->whereDate('start', '>=', $start)->whereDate('end', '<=', $end)->get();

Не работает:

$events = DB::table('events')->select('id','resourceId','title','start','end')
  ->whereDate('start', '>=', $start)->whereDate('end', '<=', $end)
  ->orWhere(function($query) {
    $query->whereDate('start', '<=', $start)
          ->whereDate('end', '>=', $end);
    })
  ->get();

Разве orWhere не должен работать с whereDate?

1 Ответ

2 голосов
/ 16 июня 2020

Первый; при использовании замыканий вам необходимо передавать аргументы с помощью use. Вы можете or два основных условия, и во вложенных условиях оба подусловия будут and ed.

public function index()
{
    DB::table('events')
        ->select('id', 'resourceId', 'title', 'start', 'end')
        ->where(function ($query) use ($start, $end) {
            $query->whereDate('start', '>=', $start)->whereDate('end', '<=', $end);
        })
        ->orWhere(function ($query) use ($start, $end) {
            $query->whereDate('start', '<=', $start)->whereDate('end', '>=', $end);
        })
        ->get();
}

Эта функция будет печатать (не обращайте внимания на даты, просто пример)

SELECT `id`, `resourceId`, `title`, `start`, `end`
FROM `events`
WHERE (date(`start`) >= '2020-06-15' and date(`end`) <= '2020-06-16')
   or (date(`start`) <= '2020-06-15' and date(`end`) >= '2020-06-16')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...