Solución:
En Laravel 5.3 (y sigue siendo cierto a partir de 7.x) puede usar un whereres más granulares pasados como una matriz:
$query->where([
['column_1', '=', 'value_1'],
['column_2', '<>', 'value_2'],
[COLUMN, OPERATOR, VALUE],
...
])
Personalmente, no he encontrado casos de uso para esto en solo varios where
llamadas, pero el hecho es que puedes usarlo.
Desde junio de 2014 puede pasar una matriz a where
Siempre que quieras todos los wheres
usar and
operador, puede agruparlos de esta manera:
$matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];
// if you need another group of wheres as an alternative:
$orThose = ['yet_another_field' => 'yet_another_value', ...];
Luego:
$results = User::where($matchThese)->get();
// with another group
$results = User::where($matchThese)
->orWhere($orThose)
->get();
Lo anterior resultará en dicha consulta:
SELECT * FROM users
WHERE (field = value AND another_field = another_value AND ...)
OR (yet_another_field = yet_another_value AND ...)
Los ámbitos de consulta pueden ayudarlo a que su código sea más legible.
http://laravel.com/docs/eloquent#query-scopes
Actualizando esta respuesta con algún ejemplo:
En su modelo, cree métodos de ámbitos como este:
public function scopeActive($query)
{
return $query->where('active', '=', 1);
}
public function scopeThat($query)
{
return $query->where('that', '=', 1);
}
Luego, puede llamar a estos ámbitos mientras crea su consulta:
$users = User::active()->that()->get();
Puede usar subconsultas en una función anónima como esta:
$results = User::where('this', '=', 1)
->where('that', '=', 1)
->where(function($query) {
/** @var $query IlluminateDatabaseQueryBuilder */
return $query->where('this_too', 'LIKE', '%fake%')
->orWhere('that_too', '=', 1);
})
->get();