construir una consulta con cláusula condicional donde en modelo elocuente
Pregunta
Necesito crear una consulta con un modelo elocuente que incluya una cláusula condicional Where.Creé algo buscando en Google.Pero no parece estar funcionando.
if ($status) {
$this->where('status', $status);
}
if ($assignedto) {
$this->where('assigned_to', $assignedto);
}
if ($fromDate != null && $toDate != null) {
$this->whereBetween('date', array($fromDate, $toDate));
}
$quotes = $this->orderBy('date', 'desc')->paginate(40);
Este devuelve todos los resultados sin filtrar el estado, la asignación y las fechas.
Solución
Acabo de actualizarlo asignando $this
a una nueva variable porque cuando asigné la consulta a $this
, se muestra un error, generalmente no se puede escribir por escrito.
$quoteModel = $this;
if ($status) {
$quoteModel = $quoteModel->where('status', $status);
}
if ($assignedto) {
$quoteModel = $quoteModel->where('assigned_to', $assignedto);
}
if ($fromDate != null && $toDate != null) {
$quoteModel = $quoteModel->whereBetween('date', array($fromDate, $toDate));
}
$quotes = $quoteModel->orderBy('date', 'desc')->paginate(40);
que funciona perfectamente ahora.Pero si alguien tiene una mejor opción, por favor sugiera.Gracias.
Otros consejos
Agregué un alcance a mi modelo y lo llamé desde el controlador.De esta manera, el trabajo de filtrado real se realiza en el modelo, el controlador simplemente ejecuta la consulta a través del alcance del filtro.
Modelo:
Obtengo parámetros de URL con Input::get
, pero también los pasarías como parámetros de entrada a la función.
public function scopeFilter($query)
{
$published = Input::get('published');
if (isset($published)) $query->where('published', '=', $published);
return $query;
}
Controlador:
Aquí la consulta se ejecuta a través del filter()
antes de devolverlo a la vista.
public function index()
{
return View::make('articles.index', [
'articles' => Article::with('writer')->filter()->get()
]);
}