我有employees表和一个联接到另一个表的表,该表中有联接日期和辞职日期,默认值为null 因此,当我选择一个日期(今天说)时,我想检索所选日期介于其加入日期和辞职日期之间的所有雇员,但是许多雇员的辞职默认值为空。因此查询无法正常工作。下面是我当前的代码
\DB::table('caregivers')
->join('caregiver_professional_details',function($q){
$q->on('caregivers.id', '=','caregiver_professional_details.caregiver_id')
->where('caregiver_professional_details.role','=','Caregiver')
->whereDate('caregiver_professional_details.date_of_joining','<=',$date
->whereDate('caregiver_professional_details.resignation_date','>=',$date);
})
因此,当我选择一个小于或等于2018年12月20日的日期时,1和2都应显示 如果我选择21以上,则只有2应该显示
答案 0 :(得分:1)
我认为您的逻辑是,您想匹配输入日期在加入日期之前的雇员, 而辞职日期晚于输入日期或辞职日期为NULL
,在这种情况下,我们可以假定他尚未辞职。也就是说,我建议您要使用以下WHERE
子句:
date_of_joining <= DATE AND
(resignation_date >= DATE OR resignation_date IS NULL)
要在您的Laravel代码中形成此逻辑,我们可以使用匿名函数:
DB::table('caregivers')
->join('caregiver_professional_details', function($q) {
$q->on('caregivers.id', '=',
'caregiver_professional_details.caregiver_id')
->where('caregiver_professional_details.role','=','Caregiver')
->whereDate('caregiver_professional_details.date_of_joining', '<=', $date)
->where(function($query) {
$query->whereDate('caregiver_professional_details.resignation_date', '>=', $date)
->orWhereNull('caregiver_professional_details.resignation_date');
})
});
答案 1 :(得分:1)
您的查询应如下所示:
\DB::table('caregivers')
->join('caregiver_professional_details',function($q){
$q->on('caregivers.id', '=','caregiver_professional_details.caregiver_id')
->where('caregiver_professional_details.role','=','Caregiver')
->where(function($r) use ($date){
$r->whereDate('caregiver_professional_details.date_of_joining','<=',$date)
->orWhereNull('caregiver_professional_details.date_of_joining');
})
->where(function($r) use ($date){
$r->whereDate('caregiver_professional_details.resignation_date','>=',$date)
->orWhereNull('caregiver_professional_details.resignation_date');
});
})
答案 2 :(得分:1)
您应将where()
与闭包+ orWhereNull()
一起使用。
此外,我认为最好使用别名以提高可读性。
$caregivers = \DB::table('caregivers')
->join('caregiver_professional_details as details', function($query){
$query
->on('caregivers.id', '=', 'details.caregiver_id')
->where('details.role', '=', 'Caregiver')
->whereDate('details.date_of_joining', '<=', $date)
->where(function($query){
$query
->whereDate('details.resignation_date', '>=', $date)
->orWhereNull('details.resignation_date');
});
})
->get();