sql >> Databáze >  >> RDS >> Mysql

Laravel 5 pomocí podmínky NEBO s BETWEEN

Existuje orWhereBetween metoda dostupná z Tvůrce dotazů, ale není zdokumentována v dokumentaci k Tvůrci dotazů . Můžete jej však najít v dokumentaci Laravel API .

Níže uvedená vysvětlení předpokládají, že proměnné mají následující hodnoty:

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

Bohužel pomocí orWhereBetween druhá podmínka není ve vašem případě použitelná, protože obě whereBetween a orWhereBetween zkontroluje, zda je hodnota sloupce mezi dvěma vstupními hodnotami. To je v pořádku od vaší první podmínky, protože kontroluje, zda existing_start hodnota sloupce je mezi $newStart a $newEnd . Takže je to v pořádku:

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

Jak bude zkompilován do:

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

Vaše druhá podmínka však chce zkontrolovat, zda je vstupní hodnota z $newStart je mezi dvěma hodnotami sloupce existing_start a existing_end a neexistuje žádná metoda Query Builder, která by to dělala. Takže to nebude fungovat:

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

Protože bude zkompilován do:

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

Všimněte si zpětných znamének ` kolem 1 , kvůli tomu se MySQL pokusí najít sloupec s názvem 1 a vyvolá chybu.

Nejlepší možností je tedy použít orWhereRaw s vázáním jako je toto:

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

? bude nahrazeno hodnotou $newStart které budou správně citovány a uvozeny, aby se zabránilo vkládání SQL.

Nebo samozřejmě vždy existuje možnost mít dvě seskupené podmínky, které kontrolují hranice, což by bylo ekvivalentní vašemu BETWEEN podmínka:

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

Které se zkompilují do:

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


  1. PyMySQL vrací staré/hodnoty snímku/neopakuje dotaz?

  2. Jak TO_SECONDS() funguje v MariaDB

  3. Nechat mysql_fetch_assoc automaticky detekovat návratové datové typy?

  4. Dynamický křížový dotaz MySQL:Výběr podřízených záznamů jako dalších sloupců