laravel查询生成器包含复杂的位置

时间:2014-03-05 22:09:31

标签: laravel query-builder

我有一个像这样的SQL句子

select count(*) as aggregate from books inner join apartments on apartment_id = apartments.id 
                where (date_ini <= ? and date_fin > ?) 
                or (date_ini < ? and date_fin >= ?) 
                or (date_ini >= ? and date_fin <= ?)

我已经在laravel中做了句子

$searchResult=DB::table('books')->join('apartments', 'apartment_id', '=', 'apartments.id')
    ->where(function($query){
        $query->where('date_ini', '<=', Input::get( 'desdeGet' ))
                ->where('date_fin','>', Input::get( 'desdeGet' ));
    })
    ->orwhere(function($query){
                                $query  ->where('date_ini', '<', Input::get( 'hastaGet' ))
                                        ->where('date_fin', '>=', Input::get( 'hastaGet' ));
                                })->orwhere(function($query){
                            $query->where('date_ini', '>=', Input::get( 'desdeGet' ))
                                    ->where('date_fin', '<=', Input::get( 'hastaGet' ));
                        })->paginate(2);

一切都还可以但是我需要在子句的末尾添加一个AND条件,我意识到我需要像这样包含所有前一个子句并在最后添加最后一个AND

select count(*) as aggregate from books inner join apartments on apartment_id = apartments.id 
                where (
                      (date_ini <= ? and date_fin > ?) 
                or (date_ini < ? and date_fin >= ?) 
                or (date_ini >= ? and date_fin <= ?)
                )and col1=?

我不知道如何将所有内容包含在查询构建器中,任何建议?

感谢。

1 个答案:

答案 0 :(得分:2)

将所有布尔条件放在嵌套的 where 子句中,并添加第一个将作为 AND 的where子句,如:

$searchResult=DB::table('books')->join('apartments', 'apartment_id', '=', 'apartments.id')
 ->where('col1','=','foobar') 
 ->where(function($queryContainer){
    $queryContainer->where(function($query){
        $query->where('date_ini', '<=', Input::get( 'desdeGet' ))
                ->where('date_fin','>', Input::get( 'desdeGet' ));
            })
            ->orwhere(function($query){
                                $query  ->where('date_ini', '<', Input::get( 'hastaGet' ))
                                        ->where('date_fin', '>=', Input::get( 'hastaGet' ));
            })
            ->orwhere(function($query){
                            $query->where('date_ini', '>=', Input::get( 'desdeGet' ))
                                    ->where('date_fin', '<=', Input::get( 'hastaGet' ));
            });
    })
  ->paginate(2);