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.

¿Fue útil?

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()
    ]);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top