sql >> Database >  >> RDS >> Mysql

Laravel 5 gebruikt OR-conditie met BETWEEN

Er is een orWhereBetween methode beschikbaar in de Query Builder, maar niet gedocumenteerd in de Query Builder-documentatie . U kunt het echter vinden in de Laravel API-documentatie .

De onderstaande uitleg gaat ervan uit dat de variabelen de volgende waarden hebben:

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

Helaas, met behulp van orWhereBetween voor de tweede voorwaarde is in uw geval niet van toepassing, omdat zowel whereBetween en orWhereBetween zal controleren of een kolomwaarde tussen twee invoerwaarden ligt. Dit is prima vanaf je eerste voorwaarde, omdat het controleert of de existing_start kolomwaarde ligt tussen $newStart en $newEnd . Dus dit is prima:

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

Zoals het zal worden gecompileerd naar:

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

Uw tweede voorwaarde wil echter controleren of een invoerwaarde van $newStart is tussen twee kolomwaarden existing_start en existing_end , en er is geen Query Builder-methode die dat doet. Dit werkt dus niet:

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

Omdat het wordt gecompileerd om:

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

Let op de backticks ` rond 1 , daarom zal MySQL proberen een kolom te vinden met de naam 1 en gooi een fout.

Dus de beste optie hier is om orWhereRaw . te gebruiken met bindingen als deze:

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

De ? wordt vervangen door de waarde van $newStart die correct wordt geciteerd en ontsnapt om SQL-injectie te voorkomen.

Of er is natuurlijk altijd de mogelijkheid om twee gegroepeerde voorwaarden te hebben die de grenzen controleren, wat gelijk zou zijn aan uw BETWEEN staat:

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

Die zal compileren naar:

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


  1. Aspecten van strings in .NET

  2. SELECTEER de ene kolom als de andere nul is

  3. Hoe een reeks te maken als deze niet bestaat

  4. Kan gegevens niet ophalen van database naar scripttag tijdens gebruik van grafiek