Отношения Laravel, где ограничение whereRaw внутри метода () - PullRequest
0 голосов
/ 07 января 2019

У меня есть две таблицы: «Сотрудник» и «СотрудникLeaveLog». Я пытаюсь получить записи сотрудников с их текущими данными за месяц, используя приведенный ниже код, но он показывает мне ошибку.

SQL-код, который я хочу поместить в whereRaw ():

SELECT * FROM employee_leave_log
WHERE UNIX_TIMESTAMP(from_date) >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + 
INTERVAL 1 DAY - INTERVAL 1 MONTH)
AND ( (till_date IS NULL) OR (UNIX_TIMESTAMP(till_date) <  
UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY)));

И код Laravel:

Employee::with(['leaveRecord' => function($query){ 
$query->whereRaw("((UNIX_TIMESTAMP(from_date) >= 
(UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH))) 
AND ( (till_date IS NULL) OR (UNIX_TIMESTAMP(till_date) <  
UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY))))");
} ])->all();

Редактировать:

EmployeeLeaveTable имеет следующие основные столбцы:

leave_log_id

employee_id

FROM_DATE

till_date (содержит Null, если отпуск применяется только на один день.)

Редактировать 2: Я обнаружил логическую ошибку в коде SQL, который я помещал в whereRaw ().

Правильный код SQL должен быть:

SELECT * FROM employee_leave_log
    WHERE (
              (
                  (UNIX_TIMESTAMP(from_date) >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH))
                  AND
                  (UNIX_TIMESTAMP(from_date) < UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY))
              )
              OR
              (
                  (UNIX_TIMESTAMP(till_date) >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH))
                  AND
                  (UNIX_TIMESTAMP(till_date) < UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY))
              )
          );

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Какую ошибку вы получаете?

Вы можете попробовать это:

Employee::with(['leaveRecord' => function ($query) {
    $query->whereDate('from_date', '>=', Carbon::now()->startOfMonth())
       ->whereNull('till_date')
       ->orWhereDate('till_date', '<=', Carbon::now()->endOfMonth());
}])->get();

Обновите, попробуйте это:

Employee::with(['leaveRecord' => function ($query) {
    $query->whereDate('from_date', '>=', Carbon::now()->startOfMonth())
        ->where(function ($query) {
            return $query->whereNull('till_date')
                ->orWhereDate('till_date', '<=', Carbon::now()->endOfMonth());
        });
}])->get();

Это должно обернуть вторую часть в (), чтобы исправить проблему.

0 голосов
/ 07 января 2019

Отвечая на мой собственный вопрос. Наконец, я нашел проблему, в операторе SQL произошла логическая ошибка.

Следующий код должен работать: -

Employee::with(['leaveRecord' => function ($query) {
$query->whereRaw("(
                  (UNIX_TIMESTAMP(from_date) >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH))
                  AND
                  (UNIX_TIMESTAMP(from_date) < UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY))
              )
              OR
              (
                  (UNIX_TIMESTAMP(till_date) >= UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH))
                  AND
                  (UNIX_TIMESTAMP(till_date) < UNIX_TIMESTAMP(LAST_DAY(CURDATE()) + INTERVAL 1 DAY))
              )")})->get();
0 голосов
/ 07 января 2019

Чтобы получить текущий месяц, вы можете сделать что-то вроде:

Employee::with(['leaveRecord' => function ($query) {
    $query->whereDate('from_date', '>=', Carbon::now()->startOfMonth());
    $query->whereDate('till_date', '<=', Carbon::now()->endOfMonth());
}])->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...