Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带“Laravel查询”;如果;条件_Php_Sql_Laravel - Fatal编程技术网

Php 带“Laravel查询”;如果;条件

Php 带“Laravel查询”;如果;条件,php,sql,laravel,Php,Sql,Laravel,我正在尝试使用Laravel 4制作高级搜索表单,以下是查询: $result = DB::table('users_ads') ->join('ads', 'users_ads.ad_id', '=', 'ads.id') ->orderBy($column, $method) ->where('status', TRUE) ->where(function($query) use ($i

我正在尝试使用Laravel 4制作高级搜索表单,以下是查询:

$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;
问题是用户可能不会使用所有的输入字段。所以我想在这一部分包括一些if条件:

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

。。因此,如果输入为空,则要删除“where”条件。

可以将每个where包装在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;
我相信,按照这些思路做的事情会奏效的

$filters=[
“简短描述”=>“搜索”,
“类别”=>“类别”,
“产品”=>“产品”,
];
.....
->其中(函数($query)使用($input,$filters)
{
foreach($column=>$key作为筛选器)
{
$value=array\u get($input,$key);
如果(!is_null($value))$query->where($column,$value);
}
});
较新版本的Laravel有一个
when
方法,使这项工作更容易:

->其中(函数($query)使用($input,$filters){
foreach($column=>$key作为筛选器){
$query->when(array\u get($input,$key),function($query,$value)use($column){
$query->where($column,$value);
});
}
});

+1对于这一点,将很好地工作,并且比我的答案更好。您的代码不排除空值。。。所以我没有得到任何结果,除非我指定所有字段!!!对不起,实际上你的代码很完美,我打错了。非常感谢。这并不是说有什么区别,但你已经改变了术语。在
get
调用之前是一个查询,之后是一个结果。哦,耶,哈哈!我只是使用op提供的变量,没有真正考虑这个问题。我要修改它!OP将所有内容链接到
get
调用,因此这确实是一个结果。是的,是的。我没怎么看变量名。不管怎样,我还是喜欢你的答案。我相信这是一个更简单更干净的方法。如果你得到的是一个普通的白色屏幕,那就很好了。您是否告诉应用程序输出视图或其他内容?如果没有输出,那么您将看到的只是一个白色屏幕。