这是我根据参数过滤值的代码。我想把它移到一行。 laravel4有没有可用的选项?
if($network) //when $network variable has a value.(i will have the same thing for orderby, customer, etc..)
{
return $deals=$mobiles->deals()->where('network','=',$network)->get();// ->orderby($orderby);
}
else
{
return $deals=$mobiles->deals()->get();
}
答案 0 :(得分:2)
使用三元组:
return $network ? $mobiles->deals()->where('network','=',$network)->get() : $mobiles->deals()->get();
答案 1 :(得分:2)
@ moonwave99(在我看来)建议的比三元更干净的方法是在模型中添加scope。
public function scopeNetwork($query, $network = null) {
if (null !== $network)
$query->where('network', $network);
return $query;
}
然后您可以使用
return $mobiles->deals()->network($network)->get();
答案 2 :(得分:0)
这是一种令人难以置信的圆形方式...我推荐@ moonwave99的解决方案,但你可以将一个闭包传递给where()
。那个,与布尔值混合,whereNotNull()
可以做到。从技术上讲,这是一行代码,但为了便于阅读,我将它拆开了。
简单方法:
return $network ? $mobiles->deals->where('network',$network)->get() : $mobiles->deals->get();
过于复杂的方式:
return $mobiles->deals->where(isset($network) ? function($query) use ($network){
$query->where('network', $network);
} : function($query){
$query->whereNotNull('id');
})->get();
答案 3 :(得分:0)
我想知道为什么没有人建议使用LIKE
代替=
。我确实喜欢这个,而且效果非常好。:)我可以使用很多动态过滤领域。 当您想要返回所有元素时,请确保将变量设置为null
。
我的代码变为
$sorttype=$orderby[0]=='-'?"desc":"asc"; //To get based on assenting or dissenting order
$orderby=$orderby[0]=='-'?substr($orderby, 1):$orderby; //just removing the first element if - existing, because that is just a flag.
if(!$network){$network=null;} //set to null
if(!$orderby){$orderby='id';} //set to id when there no order by
return $deals=$mobiles->deals()
->where('network','LIKE',$network)
->orderby($orderby,$sorttype)
->get();