> Faqs > Paréntesis en consulta Eloquent Laravel

Paréntesis en consulta Eloquent Laravel

Quiero hacer una consulta con Laravel Eloquent en la que uso paréntesis para montar las condiciones.

Son los productos que están en stock y que el precio es menor que una cantidad o que están en promoción.

Podría hacer algo como esto:

$productos = Product::where('stock', '>', 0)->where('price', '<', $quantity)->orWherePromotion(true)->get();

Pero esa consulta no es que lo que deseo, porque me daría todos los productos que están en promoción, junto con los que están en stock o tienen valor menor de una cantidad.

Para que se me entienda, quiero usar paréntesis para que mi consulta sea como esto:

where stock > 0 and (price < cantidad or promocion = 1)

Al usar paréntesis la consulta cambia radicalmente de resultados. Pero no se hacer esto en Eloquent.

Responder la pregunta
Editar Hacer otra preguntaPreguntar

Respuestas

Este tipo de consulta, con uso de paréntesis en las condiciones del Where se puede hacer con una closure o función anónima. Seguramente ya las hayas usado en Laravel en otros ejempos de Eloquent.

Simplemente es un where en el que, en vez de dar una condición, pasas por parámetro la función anónima. Lo puedes ver bien en el siguiente código:

Model::where('stock', '>', 0)->where( function($query) {
    $query->where('price', '<', $quantity)->orWhere('promotion', '=', true);
})->get();

Como puedes comprobar, Eloquent toma la función anónima como si fueran paréntesis y evalúa la consulta que hay dentro, tomando el resultado de la función anónima para evaluar la consulta generál.

Miguel Angel
460 24 32 2

Recuerda que si algo no te sale con Eloquent, siempre puedes crear SQL crudo (raw sql), que te permitirá hacer lo que necesites, pues al fin y al cabo es SQL.

En tu caso podrías hacer algo como esto:

$productos = Product::where('stock', '>', 0)->whereRaw('price < ? or promotion=1', $quantity)->get();

No te digo que siempre recurras a whereRaw para crear consultas en crudo, pero sí que es un recurso que debes tener a mano.

Guillermo
13 2