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

Více Kde In

To je velmi zajímavá otázka.

0 =1 bude vždy nepravda, takže váš dotaz vrátí nula řádků. Ale proč tomu tak je?

Protože nastavením

->whereIn('size', $size)

Laravel předpokládá, že vždy chcete, aby vrácené řádky měly jednu z velikostí v předávaném poli. Pokud v poli nepředáte žádné hodnoty, Laravel to nemůže udělat where size IN () protože to bude chyba syntaxe (v podstatě říkáte, dejte mi všechny řádky, které odpovídají této velikosti, ale nepředáte velikost). Takže v případě, že je pole prázdné, vloží pouze 0 = 1 .

Abyste Laravelovi řekli, že pokud není zadána žádná velikost, že nemá přidat podmínku pro velikost, stačí před tím provést jednoduchou kontrolu.

$product = new Product;

if (!empty($sizes)) {
    $product = $product->whereIn('size', $sizes);
}

$products = $product->get();

Btw toto chování je hotfix . Pokud v předchozích verzích Laravelu předáte prázdné pole, byla právě vyvolána výjimka pro chybu syntaxe. Nyní se to řeší pouhým nastavením 1 = 0




  1. Nalezení rozdílu mezi dvěma řádky v tabulce. Věštec

  2. Získejte poslední odlišnou sadu záznamů

  3. Přejmenujte sloupec v MySQL

  4. OracleException (0x80004005) při připojování k databázi Oracle