0

我有两个表,“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))
              )
          );
4

3 回答 3

1

回答我自己的问题。终于找到问题了,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();
于 2019-01-07T11:25:56.923 回答
0

要获得当月的假期,您可以执行以下操作:

Employee::with(['leaveRecord' => function ($query) {
    $query->whereDate('from_date', '>=', Carbon::now()->startOfMonth());
    $query->whereDate('till_date', '<=', Carbon::now()->endOfMonth());
}])->get();
于 2019-01-07T07:44:44.370 回答
0

你得到什么样的错误?

你可以试试这个:

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

这应该包含第二部分()以解决问题。

于 2019-01-07T09:03:00.907 回答