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

时间:2015-01-22 10:16:41

标签: mysql laravel laravel-4 eloquent

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

目前我有以下Eloquent查询:

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

工作正常。但是我现在需要添加两个可选部分,我不想每次都复制查询。

如果$ x(这是一个数组)存在,我需要添加AND WHERE userid = $ x(循环一次或多次),如果它不应该忽略那么...然后最后添加AND(WHERE状态) = $ 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中的工作方式。

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

1 个答案:

答案 0 :(得分:1)

拳头,而不是链接或在哪里我会使用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();

您可以使用相同的范围来处理用户ID条件。