Как получить список сотрудников в пределах даты присоединения и увольнения, включая нулевые даты в laravel mysql

У меня есть таблица сотрудников и присоединение к другой таблице, в которой указаны дата присоединения и дата увольнения, значение по умолчанию равно нулю. Поэтому, когда я выбираю дату, скажем, сегодня, я хочу получить всех сотрудников, на которые приходится выбранная дата. между датой присоединения и датой увольнения, но для многих значение отставки по умолчанию будет нулевым. поэтому запрос не работает. Ниже мой текущий код

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

введите здесь описание изображения

Поэтому, когда я выбираю любую дату, меньшую или равную 20 декабря 2018 года, должны отображаться как 1, так и 2, если я выбираю 21 и выше, должны отображаться только 2.


person Nitish Patra    schedule 21.12.2018    source источник
comment
предоставить образцы данных и ожидаемый результат в формате таблицы   -  person Fahmi    schedule 21.12.2018
comment
я обновил код   -  person Nitish Patra    schedule 21.12.2018


Ответы (3)


Ваш запрос должен выглядеть так:

\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');
   });
})
person Shidhartha Das    schedule 21.12.2018
comment
@Шидхарта Дас Спасибо. Он работает правильно. Несмотря на то, что это модификация решения Тима, ваше решение также будет дополнительно заботиться о нулевых значениях в столбце DOJ. - person Nitish Patra; 21.12.2018
comment
@NitishPatra Я рад, что это помогло. - person Shidhartha Das; 21.12.2018

Вы должны использовать 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();
person IndianCoding    schedule 21.12.2018
comment
@TimBiegeleisen, поздравляю, но у тебя 2 синтаксические ошибки, формат и читабельность кода пахнет. Хороший момент: вы используете return в закрытии where, но не используйте его в закрытии соединения. - person IndianCoding; 21.12.2018
comment
@IndianCoding Синтаксические ошибки в порядке, если их можно идентифицировать. Я понял это с первого взгляда, но исправил в своем фактическом решении. Я хотел задать один вопрос, каковы недостатки использования возврата в соединении, как это использовал Тим. - person Nitish Patra; 21.12.2018
comment
@NitishPatra Никаких минусов. Это загрязнение кода. Вам вообще не нужно использовать return здесь. - person IndianCoding; 21.12.2018

Я думаю, ваша логика заключается в том, что вы хотите сопоставить сотрудника, у которого дата ввода предшествует дате прихода, и дата увольнения позже даты ввода или даты увольнения является 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');
        })
});
person Tim Biegeleisen    schedule 21.12.2018
comment
Спасибо за ответ @Tim Biegeleisen. Ответ Шидхартхи Даса кажется более применимым в моем состоянии, поскольку он принимает во внимание еще один шаг, если дата присоединения остается нулевой, он будет соответствовать обоим условиям, если Министерство юстиции также является нулевым. - person Nitish Patra; 21.12.2018