只查询"Where"如果在Laravel有一个价值雄辩


Only query "Where" if there is a value in Laravel 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) : "");

使用雄辩是(真的!)很好和节省,但我还没有跟上在std类对象中使用if语句的速度。

您可以尝试这样做:

$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

如果您通过form/query string(user input)传递client_id到服务器,那么您可以尝试这样做:

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()

您还可以为此目的在模型中使用查询作用域。作用域允许您轻松地在模型中重用查询逻辑。在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

阅读更多关于模型查询范围的信息。
相关文章: