Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Laravel 5 sử dụng điều kiện HOẶC với GIỮA

Có một orWhereBetween phương thức có sẵn từ Trình tạo truy vấn, nhưng không có tài liệu trong Tài liệu về Trình tạo truy vấn . Tuy nhiên, bạn có thể tìm thấy nó trong Tài liệu API của Laravel .

Các giải thích bên dưới giả định rằng các biến có các giá trị sau:

$newStart = '1';
$newEnd = '10';

Thật không may, bằng cách sử dụng orWhereBetween đối với điều kiện thứ hai không áp dụng được trong trường hợp của bạn, vì cả whereBetweenorWhereBetween sẽ kiểm tra xem một giá trị cột có nằm giữa hai giá trị đầu vào hay không. Điều này tốt từ điều kiện đầu tiên của bạn vì nó kiểm tra xem existing_start giá trị cột nằm giữa $newStart$newEnd . Vì vậy, điều này là tốt:

->whereBetween('existing_start', [$newStart, $newEnd])

Vì nó sẽ được biên dịch thành:

WHERE `existing_start` BETWEEN '1' AND '10'

Tuy nhiên, điều kiện thứ hai của bạn muốn kiểm tra xem giá trị đầu vào từ $newStart nằm giữa hai giá trị cột existing_startexisting_end và không có phương thức Trình tạo truy vấn nào thực hiện điều đó. Vì vậy, điều này sẽ không hoạt động:

->orWhereBetween($newStart, ['existing_start', 'existing_end'])

Vì nó sẽ được biên dịch thành:

OR `1` BETWEEN 'existing_start' AND 'existing_end'

Lưu ý các dấu gạch ngược ` khoảng 1 , do đó MySQL sẽ cố gắng tìm một cột có tên 1 và đưa ra một lỗi.

Vì vậy, tùy chọn tốt nhất ở đây là sử dụng orWhereRaw với các ràng buộc như thế này:

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
  ->get();

? sẽ được thay thế bằng giá trị của $newStart sẽ được trích dẫn và thoát đúng cách để tránh bị chèn SQL.

Hoặc tất nhiên luôn có tùy chọn có hai điều kiện được nhóm để kiểm tra ranh giới, điều này sẽ tương đương với BETWEEN của bạn điều kiện:

DB::table('tbl')
  ->whereBetween('existing_start', [$newStart, $newEnd])
  ->orWhere(function ($query) use ($newStart) {
      $query->where('existing_start', '<=', $newStart);
      $query->where('existing_end', '>=', $newStart);
  })->get();

Cái nào sẽ được biên dịch thành:

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. Decimal VS Int trong MySQL?

  2. SQL để kiểm tra xem cơ sở dữ liệu có trống không (không có bảng)

  3. Xóa kết quả lặp lại khỏi truy vấn MySQL

  4. MySQL - Mac - Lỗi 2002 - Không thể kết nối với cục bộ ... thông qua socket

  5. Làm cách nào để tìm bảng của tôi là MyISAM hay Innodb