我是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中的工作方式。
有人能指出我正确的方向吗?用户指南和任何网站示例似乎都没有看到这种情况!
答案 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条件。