Mysql
 sql >> база данни >  >> RDS >> Mysql

Laravel 5 използва условие OR с BETWEEN

Има orWhereBetween метод, наличен от Query Builder, но е недокументиран в Документацията на Query Builder . Можете обаче да го намерите в Документацията за API на Laravel .

Обясненията по-долу предполагат, че променливите имат следните стойности:

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

За съжаление, с помощта на orWhereBetween за второто условие не е приложимо във вашия случай, тъй като и двете whereBetween и orWhereBetween ще провери дали стойността на колона е между две входни стойности. Това е добре от първото ви условие, тъй като проверява дали existing_start Стойността на колоната е между $newStart и $newEnd . Така че това е добре:

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

Тъй като ще бъде компилиран в:

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

Второто ви условие обаче иска да провери дали е въведена стойност от $newStart е между две стойности на колони existing_start и existing_end , и няма метод на Query Builder, който да прави това. Така че това няма да работи:

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

Тъй като ще бъде компилиран във:

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

Обърнете внимание на обратните отметки ` около 1 , поради това MySQL ще се опита да намери колона с име 1 и извежда грешка.

Така че най-добрият вариант тук е да използвате orWhereRaw с връзки като това:

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

? ще бъде заменен със стойността на $newStart които ще бъдат правилно цитирани и екранирани, за да се избегне SQL инжекция.

Или, разбира се, винаги има възможност да имате две групирани условия, които проверяват границите, което би било еквивалентно на вашето BETWEEN условие:

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

Което ще се компилира в:

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. Активиране на отдалечена MySQL връзка:ГРЕШКА 1045 (28000):Достъпът е отказан за потребителя

  2. java.lang.AbstractMethodError:com.mysql.jdbc.Connection.isValid(I)Z

  3. Препратка към външния ключ на MySQL

  4. Прости произволни извадки от Sql база данни

  5. Създаване на свързан списък или подобна опашка в MySQL?