Rome
Rome

Reputation: 442

Adding OR statements to Eloquent Queries

I need a little help regarding the syntax of Eloquent. I want to add more where clauses but can't get the OR working. I read https://laravel.com/docs/7.x/queries#where-clauses but my statement fails.

Works:

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

Does not work:

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

Is orWhere not supposed to work with whereDate?

Upvotes: 1

Views: 40

Answers (1)

Ersoy
Ersoy

Reputation: 9596

First; while using closures you need to pass arguments with use. You may or two main conditions and in their nested conditions both sub-conditions will be anded.

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

This function will print (don't mind about the dates, just example)

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')

Upvotes: 2

Related Questions