如何在Laravel MySQL

时间:2018-12-21 05:37:29

标签: mysql laravel

我有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);
})

enter image description here

因此,当我选择一个小于或等于2018年12月20日的日期时,1和2都应显示 如果我选择21以上,则只有2应该显示

3 个答案:

答案 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();