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

Multiplo dove dentro

Questa è una domanda molto interessante.

0 =1 sarà sempre falso, quindi la tua query restituirà zero righe. Ma perché questo?

Perché impostando

->whereIn('size', $size)

Laravel presume che tu voglia sempre che le righe restituite siano con una delle dimensioni nell'array passato. Se non passi alcun valore nell'array, Laravel non può farlo where size IN () perché sarà un errore di sintassi (in pratica dici di darmi tutte le righe che corrispondono a questa dimensione, ma non la passi alla dimensione). Quindi, nel caso in cui l'array sia vuoto, inserisce semplicemente 0 = 1 .

Per dire a Laravel, se non viene superata alcuna taglia, di non aggiungere condizioni per la taglia, metti un semplice segno di spunta prima.

$product = new Product;

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

$products = $product->get();

A proposito, questo comportamento è un hotfix . Nelle versioni precedenti di Laravel, se si passa un array vuoto, viene generata un'eccezione per un errore di sintassi. Ora viene gestito semplicemente impostando 1 = 0