sql >> Database teknologi >  >> RDS >> Mysql

Laravel 5 bruger ELLER tilstand med BETWEEN

Der er en orWhereBetween metode tilgængelig fra Query Builder, men den er udokumenteret i Query Builder-dokumentationen . Du kan dog finde det i Laravel API-dokumentation .

Forklaringerne nedenfor antager, at variablerne har følgende værdier:

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

Desværre ved at bruge orWhereBetween for den anden betingelse er ikke relevant i dit tilfælde, fordi begge whereBetween og orWhereBetween vil kontrollere, om en kolonneværdi er mellem to inputværdier. Dette er fint fra din første betingelse, da det tjekker om existing_start kolonneværdien er mellem $newStart og $newEnd . Så det er fint:

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

Som det vil blive kompileret til:

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

Din anden betingelse ønsker dog at kontrollere, om en inputværdi fra $newStart er mellem to kolonneværdier existing_start og existing_end , og der er ingen Query Builder-metode, der gør det. Så dette vil ikke virke:

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

Fordi det vil blive kompileret til:

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

Læg mærke til backtikkene ` omkring 1 , på grund af det vil MySQL forsøge at finde en kolonne med navnet 1 og smid en fejl.

Så den bedste mulighed her er at bruge orWhereRaw med bindinger som denne:

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

? vil blive erstattet af værdien $newStart som vil blive korrekt citeret og escaped for at undgå SQL-injektion.

Eller selvfølgelig er der altid mulighed for at have to grupperede forhold, der kontrollerer grænserne, hvilket ville svare til din BETWEEN tilstand:

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 vil kompilere til:

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


  1. Oracle:hvordan man trækker to datoer fra og får minutter af resultatet

  2. 3 måder at slette duplikerede rækker i SQL Server, mens du ignorerer den primære nøgle

  3. Hvordan udføres SQL-forespørgsel direkte i C#?

  4. EF Core - Tabel '*.__EFMigrationsHistory' eksisterer ikke