Question

I need to build a query with eloquent model including conditional where clause. I created something by searching google. But it doesn't seems to be working.

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);

This one returns all results without the filtering of status, assigned to and dates.

Was it helpful?

Solution

I just updated it by assigning $this to a new variable because when I assigned the query to $this, it shown an error, $this cannot be over written.

$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);

which works perfectly now. But if somebody have some better option, please suggest. Thanks.

OTHER TIPS

I added a scope to my model and call it from the controller. This way the actual filtering work is done in the model, the controller is just running the query through the filter scope.

Model:

I am getting URL parameters with Input::get, but you would also pass them as input parameters to the function.

public function scopeFilter($query)
{
    $published = Input::get('published');
    if (isset($published)) $query->where('published', '=', $published);

    return $query;
}

Controller:

Here the query is run through the filter() before returning it to the view.

public function index()
{
    return View::make('articles.index', [
        'articles' => Article::with('writer')->filter()->get()
    ]);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top