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