我有一个像这样的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=?
我不知道如何将所有内容包含在查询构建器中,任何建议?
感谢。
答案 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);