这是我基于参数筛选值的代码。我想把它移到一条直线上。在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();
}
使用三进制:
return $network ? $mobiles->deals()->where('network','=',$network)->get() : $mobiles->deals()->get();
@moonwave99建议的比三元制更干净的方法(在我看来)是在你的模型中添加一个作用域。
public function scopeNetwork($query, $network = null) {
if (null !== $network)
$query->where('network', $network);
return $query;
}
你可以使用
return $mobiles->deals()->network($network)->get();
这是一种令人难以置信的迂回方式…我推荐@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();
我想知道为什么没有人建议使用LIKE
而不是=
.我这样做了,工作得很好:)我可以有很多字段的动态过滤。当您想返回所有元素时,请确保where中的变量设置为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();