我有两个表,“Employee”和“EmployeeLeaveLog”。我正在尝试使用下面的代码让员工记录他们当月的休假记录,但它向我显示了一个错误。
我想放入 whereRaw() 的 sql 代码是:
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,
员工ID,
从日期,
till_date(如果只申请一天的假期,则包含 Null。)
编辑 2: 我在放入 whereRaw() 的 SQL 代码中发现了一个逻辑错误。
正确的 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))
)
);