如何使用可选部分格式化 Laravel Eloquent 查询

How to format Laravel Eloquent query with optional sections

我是 Laravel 的新手,但正在努力解决 Eloquent 查询如何具有可选部分的问题。

我现在有以下 Eloquent 查询:

Posts::where('approved', '=', 'Y')->orderBy('created_at', 'DESC')->take($noofposts)->skip($skipno)->get();

效果很好。但是我现在需要添加两个可选部分,我想这样做而不必每次都重复查询。

如果存在 $x(这是一个数组),我需要添加 AND WHERE userid=$x(循环一次或多次),如果不存在,则应忽略...最后添加 AND ( WHERE status=$y[0] OR $status=$y[1] OR $status=$y[2]) - 如果未设置状态标志,则忽略。

基本上,如果没有设置标志,我会以原始查询结束,但如果是,我们会得到

Posts::where('approved', '=', 'Y')->where('userid', '=', '2')->where('userid', '=', '23')->where('status', '=', 'K')->orWhere('status', '=', 'N')->orderBy('created_at', 'DESC')->take($noofposts)->skip($skipno)->get();

我可以在正常 PHP 中完美地计算它,但无法理解它在 Laravel Eloquent 中如何工作。

谁能指出我正确的方向?用户指南和任何网站示例似乎都没有考虑这种情况!

拳头,而不是链接 orWhere 我会使用 Eloquent 的 whereIn 函数。

whereIn('status', $y);

问题是,如果 $y 为空,请求将无法工作。 (我认为它只是崩溃)

因此,如果您想避免控制并保持代码整洁,您可以在 Post 模型中添加一个查询范围。

http://laravel.com/docs/4.2/eloquent#query-scopes

scopeOptionalWhereIn($query, $field, $array){
    if(!empty($array))
        return $query->whereIn($field, $array);
    return $query; //return unchanged query
}

然后您可以在查询中使用此范围:

Posts::where('approved', '=', 'Y')
->optionalWhereIn('status', $y)
->orderBy('created_at', 'DESC')
->take($noofposts)
->skip($skipno)->get();

您或许可以使用相同的作用域来处理 userid 条件。