Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Laravel 5 menggunakan kondisi OR dengan BETWEEN

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara kerja setiap baris di pemicu di mysql?

  2. Pengembangan Rails - Tidak dapat terhubung ke server MySQL di 'localhost' (10061)

  3. SQL Tidak dapat membuat tabel (errno:150)

  4. Perbarui formulir menggunakan Ajax, PHP, MYSQL

  5. Bagaimana saya bisa meneruskan array nilai ke prosedur tersimpan saya?