2014-02-21 52 views
2

我试图与Laravel 4的高级搜索表单,这是查询:Laravel查询“if”条件?

$result = DB::table('users_ads') 
     ->join('ads', 'users_ads.ad_id', '=', 'ads.id')   
     ->orderBy($column, $method) 
     ->where('status', TRUE) 
     ->where(function($query) use ($input) 
     { 
      $query->where('short_description', $input['search']) 
        ->where('category', $input['category']) 
        ->where('product', $input['product']); 

     }) 
     ->join('users', 'users_ads.user_id', '=', 'users.id') 
     ->select('ads.id', 'ads.img1', 'ads.short_description', 'ads.category', 'ads.product', 'ads.price', 'users.city') 
     ->get(); 

    return $result; 

的问题是,用户可能不会使用所有输入字段。所以我想包括一些如果条件在这部分:

$query->where('short_description', $input['search']) 
        ->where('category', $input['category']) 
        ->where('product', $input['product']); 

..所以如果输入是空的,要删除“where”条件。

回答

4
$filters = [ 
    'short_description' => 'search', 
    'category' => 'category', 
    'product' => 'product', 
]; 

..... 

->where(function($query) use ($input, $filters) 
{ 
    foreach ($filters as $column => $key) 
    { 
     $value = array_get($input, $key); 

     if (! is_null($value)) $query->where($column, $value); 
    } 
}); 

Laravel的更新版本有when方法,使这更简单:

->where(function ($query) use ($input, $filters) { 
    foreach ($filters as $column => $key) { 
     $query->when(array_get($input, $key), function ($query, $value) use ($column) { 
      $query->where($column, $value); 
     }); 
    } 
}); 
+0

+1为此,将工作得很好,而且比我的回答更好。 – Joe

+0

你的代码不排除空值...所以我没有得到任何结果,除非我指定所有的领域! –

+0

对不起,但实际上你的代码是完美的,我犯了一个输入错误。非常感谢你。 –

1

你可以在if语句中包装每个地方。

$query = DB::table('user_ads') 
      ->join('ads', 'users_ads.ad_id', '=', 'ads.id') 
      ->orderBy($column, $method); 

if ($input['search']) { 
    $query->where('short_description', $input['search']); 
} 

if ($input['category']) { 
    $query->where('category', $input['category']); 
} 

$query->join('users', 'users_ads.user_id', '=', 'users.id') 
    ->select('ads.id', 'ads.img1', 'ads.short_description', 'ads.category', 'ads.product', 'ads.price', 'users.city') 

$result= $query->get(); 

return $result; 

我相信这些内容会起作用。

+0

不,它使多大的差别,但是你翻转的术语。在“get”调用之前它是一个查询,之后是结果。 –

+0

哦,你好,哈哈!我只是使用该操作提供的变量,并没有真正想到这一点。我会修改它! – Joe

+0

OP将所有东西都链接到'get'调用,所以它确实是一个结果。 –