У меня есть две таблицы: «Сотрудник» и «Сотрудник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))
)
);