我有一个需要完成的搜索查询。但是,搜索并不总是设置所有值,就像在这种情况下一样。
$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语句的速度。任何帮助表示赞赏。
答案 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_id
将form/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();
您也可以使用其他方法将其链接,就像您在雄辩的查询中所做的那样。
了解有关模型查询范围的更多信息