sql >> Databasteknik >  >> RDS >> Mysql

Laravel 5 använder ELLER tillstånd med BETWEEN

Det finns en orWhereBetween metod tillgänglig från Query Builder, men den är odokumenterad i Query Builder-dokumentationen . Du kan dock hitta det i Laravel API-dokumentation .

Förklaringarna nedan förutsätter att variablerna har följande värden:

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

Tyvärr använder du orWhereBetween för det andra villkoret är inte tillämpligt i ditt fall, eftersom båda whereBetween och orWhereBetween kommer att kontrollera om ett kolumnvärde ligger mellan två indatavärden. Detta är bra från ditt första tillstånd eftersom det kontrollerar om existing_start kolumnvärdet är mellan $newStart och $newEnd . Så det här är bra:

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

Som det kommer att kompileras till:

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

Men ditt andra villkor vill kontrollera om ett indatavärde från $newStart är mellan två kolumnvärden existing_start och existing_end , och det finns ingen Query Builder-metod som gör det. Så det här kommer inte att fungera:

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

Eftersom det kommer att kompileras till:

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

Lägg märke till backtickarna ` runt 1 , på grund av det kommer MySQL att försöka hitta en kolumn med namnet 1 och skapa ett fel.

Så det bästa alternativet här är att använda orWhereRaw med bindningar så här:

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

? kommer att ersättas av värdet $newStart som kommer att citeras korrekt och escaped för att undvika SQL-injektion.

Eller så finns det alltid alternativet att ha två grupperade villkor som kontrollerar gränserna, vilket skulle motsvara din BETWEEN skick:

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

Som kommer att kompilera till:

SELECT * FROM `tbl`
WHERE
  `existing_start` BETWEEN '1' AND '10' OR
  (`existing_start` <= '1' AND `existing_end` >= '1')


  1. PHP:varför kan jag inte loopa två gånger på mysqli_fetch_array() resultat?

  2. Kontrollera om en postgresql-tabell finns under python (och förmodligen Psycopg2)

  3. MySQL-satsen tar mer än minut att exekvera

  4. Använda ODBC med Salesforce och Okta Single Sign On (SSO)