Ada orWhereBetween
metode yang tersedia dari Pembuat Kueri, tetapi tidak didokumentasikan dalam Dokumentasi Pembuat Kueri . Namun Anda dapat menemukannya di Dokumentasi API Laravel .
Penjelasan di bawah ini mengasumsikan bahwa variabel memiliki nilai sebagai berikut:
$newStart = '1';
$newEnd = '10';
Sayangnya, menggunakan orWhereBetween
untuk kondisi kedua tidak berlaku dalam kasus Anda, karena keduanya whereBetween
dan orWhereBetween
akan memeriksa apakah nilai kolom berada di antara dua nilai input. Ini baik-baik saja dari kondisi pertama Anda karena memeriksa apakah existing_start
nilai kolom berada di antara $newStart
dan $newEnd
. Jadi ini baik-baik saja:
->whereBetween('existing_start', [$newStart, $newEnd])
Karena akan dikompilasi ke:
WHERE `existing_start` BETWEEN '1' AND '10'
Namun kondisi kedua Anda ingin memeriksa apakah nilai input dari $newStart
berada di antara dua nilai kolom existing_start
dan existing_end
, dan tidak ada metode Query Builder yang melakukan itu. Jadi ini tidak akan berhasil:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Karena akan dikompilasi menjadi:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Perhatikan backtick `
sekitar 1
, karena itu MySQL akan mencoba mencari kolom bernama 1
dan membuat kesalahan.
Jadi opsi terbaik di sini adalah menggunakan orWhereRaw
dengan binding seperti ini:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
akan diganti dengan nilai $newStart
yang akan dikutip dengan benar dan diloloskan untuk menghindari injeksi SQL.
Atau tentu saja selalu ada opsi untuk memiliki dua kondisi yang dikelompokkan yang memeriksa batas, yang akan setara dengan BETWEEN
Anda kondisi:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
Yang akan dikompilasi menjadi:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')