如何在 Laravel 两天之间请假

How to get leave between two days in Laravel

我有一个 table 名字 leave_requests 这样的 [请假table][1] [1]: https://i.stack.imgur.com/B7VvC.png 从上面 table 只有当我的状态为“已批准”时,我才想获得两次之间的总假期(从 2021-12-02 到 2021-12-07),到目前为止我已经这样做了

LeaveRequest
    ::where("start_date", ">=", $request->from)
    ->where("end_date", "<=", $request->to)
    ->where("status", "approved")
    ->get()

从上面的代码我匹配两个日期条件,这是输出:

{
    "id": 31,
    "code": "1o1545",
    "organization_id": 1,
    "employee_id": 7,
    "leave_id": 1,
    "start_date": "2021-12-03",
    "end_date": "2021-12-06",
    "reason": "sick",
    "status": "approved",
    "created_at": "2021-12-01 21:01:59",
    "updated_at": "2021-12-01 21:02:14",
    "leave_days": 4,
    "is_archived": false,
    "is_inactive": true,
    "is_geofencing": false,
    "is_tax_exempted": false,
    "full_name": "",
    "current_position": null
},
{
    "id": 34,
    "code": "mygm39",
    "organization_id": 1,
    "employee_id": 7,
    "leave_id": 1,
    "start_date": "2021-12-04",
    "end_date": "2021-12-04",
    "reason": "ljk",
    "status": "approved",
    "created_at": "2021-12-03 09:35:59",
    "updated_at": "2021-12-03 09:35:59",
    "leave_days": 1,
    "is_archived": false,
    "is_inactive": true,
    "is_geofencing": false,
    "is_tax_exempted": false,
    "full_name": "",
    "current_position": null
},
{
    "id": 35,
    "code": "m1e8zy",
    "organization_id": 1,
    "employee_id": 7,
    "leave_id": 1,
    "start_date": "2021-12-07",
    "end_date": "2021-12-07",
    "reason": "jj",
    "status": "approved",
    "created_at": "2021-12-03 09:36:43",
    "updated_at": "2021-12-03 09:36:43",
    "leave_days": 1,
    "is_archived": false,
    "is_inactive": true,
    "is_geofencing": false,
    "is_tax_exempted": false,
    "full_name": "",
    "current_position": null
}

问题是它不会给我显示日期的行,比如日期从 (2021-12-02) 开始,但它没有给我那个记录以及如何计算叶子列中的叶子。希望我清楚,请有人在这里帮助我我是新手 laravel 谢谢。

试试这个查询:

LeaveRequest
    ::where("start_date", ">=", $request->from)
    ->where("end_date", "<=", $request->to)
    ->where("status", "approved")
    ->select('leave_id', \DB::raw('count(*) as total_leaves'))
    ->groupBy('leave_id')
    ->get();

我终于找到了解决方案,下面是为将来某人附加的代码:

use App\Models\LeaveRequest;
use Carbon\CarbonPeriod;

$total_leaves = 0;
    LeaveRequest
    ::when($request->from && $request->to, function($query) use($request) {
        $query
            ->whereDate("leave_requests.start_date", "<=", $request->to)
            ->whereDate("leave_requests.end_date", ">=", $request->from);
    })
    ->when($request->from && !$request->to, function($query) use($request) {
        $query
            ->whereDate("leave_requests.start_date", "<=", $request->from)
            ->whereDate("leave_requests.end_date", ">=", $request->from);
    })
    ->where("leave_requests.status", "approved")
    ->get()
    ->map(function($leave_request) use(&$total_leaves, $request) {
        // echo $leave_request->start_date . " " . $leave_request->end_date . "<br/>";
        if(!$request->to && Carbon::parse($request->from)->betweenIncluded($leave_request->start_date, $leave_request->end_date)) {
            $total_leaves++;
        } else {
            // echo $leave_request->start_date . " " . $leave_request->end_date . "<br/>";
            $DB_periods = CarbonPeriod::create($leave_request->start_date, $leave_request->end_date);
            $REQUEST_periods = CarbonPeriod::create($request->from, $request->to);
            foreach ($DB_periods as $period1) {
                // echo "DB-> " . $period1->format('Y-m-d') . "<br>";
                foreach($REQUEST_periods as $period2) {
                    // echo "Request-> " . $period2->format('Y-m-d') . "<br>";
                    if($period1 == $period2) {
                        $total_leaves++;
                    }
                }
            }
        }
    });

    return "Total Leaves: " . $total_leaves;

正如我所说的,我是编程新手,经过许多小时的艰辛后才做出这个解决方案,所以关键是这段代码很长,可能不是很好的做法,所以如果有专业人士可以将它最小化,谢谢。