Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Laravel 5 przy użyciu warunku OR z BETWEEN

Istnieje orWhereBetween metoda dostępna z Konstruktora zapytań, ale nie jest udokumentowana w Dokumentacji Konstruktora zapytań . Możesz go jednak znaleźć w Dokumentacji Laravel API .

Poniższe wyjaśnienia zakładają, że zmienne mają następujące wartości:

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

Niestety, używając orWhereBetween dla drugiego warunku nie ma zastosowania w twoim przypadku, ponieważ oba whereBetween i orWhereBetween sprawdzi, czy wartość w kolumnie znajduje się między dwiema wartościami wejściowymi. Jest to w porządku od pierwszego warunku, ponieważ sprawdza, czy existing_start wartość kolumny jest między $newStart i $newEnd . Więc to jest w porządku:

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

Ponieważ zostanie skompilowany do:

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

Jednak twój drugi warunek chce sprawdzić, czy wartość wejściowa z $newStart znajduje się między dwiema wartościami kolumny existing_start i existing_end , a nie istnieje metoda konstruktora zapytań, która to robi. Więc to nie zadziała:

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

Ponieważ zostanie skompilowany do:

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

Zwróć uwagę na znaki ` wokół 1 , dlatego MySQL spróbuje znaleźć kolumnę o nazwie 1 i wyrzuć błąd.

Więc najlepszą opcją jest użycie orWhereRaw z takimi wiązaniami:

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

? zostanie zastąpiona wartością $newStart które zostaną prawidłowo zacytowane i zmienione, aby uniknąć wstrzyknięcia SQL.

Oczywiście zawsze istnieje możliwość posiadania dwóch zgrupowanych warunków, które sprawdzają granice, co odpowiadałoby twojemu BETWEEN warunek:

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

Który skompiluje się do:

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. Jak uruchomić klaster MySQL lub MariaDB Galera — zaktualizowano

  2. 5 najlepszych narzędzi do monitorowania MySQL

  3. Używanie .aggregate() na wartości wprowadzonej za pomocą .extra(select={...}) w zapytaniu Django?

  4. uwięzienie ostrzeżenia MySQL

  5. Jak możemy znaleźć nazwę domeny za pomocą MySQL i wyrażenia regularnego