我在搜索引擎中工作,我的控制器中有这样的东西:
$user = User::where('description', 'LIKE', '%'.$keyword.'%')
->where('position', $position)
->where('age', $age)
->orderBy('created_at', 'DES')
->paginate(10);
我想要的是仅在$position
和$age
过滤器存在时才使用它们。我的意思是,如果我只设置keyword
,我希望应用程序向我显示具有此关键字的所有用户(无论其位置和年龄如何)。
我知道这样做的方法......使用if($position == '')... else...
,但我想在我的Eloquent咨询中做(如果可能的话)。类似...... ->where('position' ? $position)
。
知道如何以最简单的方式做到这一点吗?
提前致谢!
答案 0 :(得分:1)
使用if条件是最好的方法。据我所知,你的后续功能没有内置到Eloquent中。
我会使用像这样的条件:
$query = User::where('description', 'LIKE', '%'.$keyword.'%');
if($position) {
$query->where('position', $position);
}
if($age) {
$query->where('age', $age);
}
$user = $query->orderBy('created_at', 'DES')->paginate(10);
答案 1 :(得分:1)
如果您想保持控制器清洁并避免 - 否则您可以在模型中创建一些范围。
例如:
public function scopePosition($query, $position)
{
//If $position in empty, return the query without where clause
return !($position == '') ? $query->where('position', $position) : $query;
}
并且:
public function scopeAge($query, $age)
{
//If $age in empty, return the query without where clause
return !($age== '') ? $query->where('age', $age) : $query;
}
然后像这样使用它:
$user = User::where('description', 'LIKE', '%'.$keyword.'%')
->position($position)
->age($age)
->orderBy('created_at', 'DES')
->paginate(10);