只查询" Where"如果Laravel雄辩有价值的话

时间:2014-06-11 09:25:39

标签: php class laravel-4 eloquent

我有一个需要完成的搜索查询。但是,搜索并不总是设置所有值,就像在这种情况下一样。

$aEvents = DB::table('events')
->where('client_id', '=', $client_id);

问题是,我怎样才能使这个where语句依赖于$ client_id的值。因此,如果值为空,我不希望发生Where语句。

另外,我不想在PHP中用if语句编写几个完整的查询。对许多变量。理想情况下,我喜欢这样的事情:

$aEvents = DB::table('events')
->(($client_id != "") ? where('client_id', '=', $client_id) : "");

使用eloquent(真的!)很好并保存,但我还没有达到使用std Class对象中的if语句的速度。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

$query = DB::table('events');
if(!empty($client_id)) {
    $query->where('client_id', $client_id);
}
$aEvents = $query->get(); // Call this at last to get the result

如果您通过client_idform/query string(user input)传递给服务器,那么您可以尝试这样的事情:

if($client_id = Input::get('client_id')) {
     $query->where('client_id', $client_id);
}

更新:对于分页,请尝试以下操作:

$ aEvents = $ query-> paginate(10); //每页10个

因此,如果您将此方法传递给您,可以在视图中调用links()方法:

return View::make('viewName')->with('aEvents', $aEvents);

在分页链接的视图中:

$aEvents->links()

答案 1 :(得分:0)

您还可以在模型中使用查询范围来实现此目的。通过范围,您可以轻松地在模型中重复使用查询逻辑。在模型Event中,您可以添加以下查询范围:

public function scopeClientID($query, $client_id)
{
    if ($client_id != '') {
        return $query->where('client_id', '=', $client_id);
    } else {
        return $query;
    }
}

然后从您的控制器或您呼叫它的任何地方,您可以执行以下操作:

$aEvents = Event::clientID($client_id);

如果您想获得所有结果,那么您可以这样做:

$aEvents = Event::clientID($client_id)->get();

或者,如果你想要分页,你可以这样做:

$aEvents = Event::clientID($client_id)->paginate();

您也可以使用其他方法将其链接,就像您在雄辩的查询中所做的那样。

您可以在http://laravel.com/docs/eloquent#query-scopes

了解有关模型查询范围的更多信息