Laravel 4 - Eloquent'where'仅在存在的情况下

时间:2014-08-13 06:34:23

标签: laravel-4 conditional eloquent

我在搜索引擎中工作,我的控制器中有这样的东西:

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

知道如何以最简单的方式做到这一点吗?

提前致谢!

2 个答案:

答案 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);

更多的搜索范围: http://laravel.com/docs/eloquent#query-scopes