如何在laravel mysql中获取入职和离职日期内包含空日期的员工列表

sdnqo3pr  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(328)

我有一个employees表和一个连接到另一个表的表,其中有加入日期和辞职日期,默认值为null,所以当我选择一个日期时,比如今天,我想检索所有选择的日期介于加入日期和辞职日期之间的员工,但对于许多人来说,辞职的默认值将为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个应该显示

yhxst69z

yhxst69z1#

你应该使用 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();
rmbxnbpk

rmbxnbpk2#

您的查询应如下所示:

\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');
   });
})
2w2cym1i

2w2cym1i3#

我认为您的逻辑是,您希望匹配输入日期早于加入日期、辞职日期晚于输入日期或辞职日期为的员工 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');
        })
});

相关问题