在eloquent模型中使用条件where子句构建查询

时间:2014-06-03 06:47:32

标签: mysql laravel eloquent builder

我需要使用包含条件where子句的雄辩模型构建查询。我通过搜索谷歌创建了一些东西。但它似乎并没有起作用。

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

这个结果返回所有结果而不过滤状态,分配给和日期。

2 个答案:

答案 0 :(得分:3)

我刚刚通过将$this分配给新变量来更新它,因为当我将查询分配给$this时,它显示错误,$this无法覆盖。

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

现在完美无缺。但如果有人有更好的选择,请建议。感谢。

答案 1 :(得分:0)

我在我的模型中添加了一个范围,并从控制器中调用它。这样,实际的过滤工作在模型中完成,控制器只是通过过滤器范围运行查询。

<强>型号:

我正在使用Input::get获取网址参数,但您也会将它们作为输入参数传递给该函数。

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

    return $query;
}

<强>控制器:

此处查询在将filter()返回到视图之前运行。

public function index()
{
    return View::make('articles.index', [
        'articles' => Article::with('writer')->filter()->get()
    ]);
}