【发布时间】:2020-02-26 03:24:20
【问题描述】:
编辑:为清楚起见,这是 Laravel 5.8。
这是针对我正在开发的 HR 应用程序。
他们要求报告显示迟到的人。当然,我想没问题。
所以我有一个表单,其中包含一些用户可以输入的自定义参数、start_date、end_date、工资和一系列部门。
public function show()
{
request()->validate([
'start_date' => 'required|date|before_or_equal:today'
]);
$start = Carbon::parse(request('start_date'));
$end = request('end_date') ? Carbon::parse(request('end_date')) : today();
$wage = request('wage');
$departments = request('departments');
$query = EmployeePunch::with([
'employee' => function($query) use ($wage, $departments) {
// IF I UN COMMENT THESE, IN THE FILTER BLOCK BELOW, THE EMPLOYEE BECOMES UNDEFINED.
// if($wage != null) {
// $query->where('hourly', $wage);
// }
// if($departments) {
// $query->whereIn('department_id', $departments);
// }
},
'employee.group',
'employee.department'
])
->whereBetween('punch_time', [$start->startOfDay(), $end->endOfDay()])
// only care about punch in for the day
->where('type', 1);
$results = $query->get();
$latePunches = $results->filter(function ($i) {
$day = strtolower($i->punch_time->format('D'));
$startTime = Carbon::parse(sprintf('%s %s',
$i->punch_time->format('d-m-Y'),
$i->employee->group[$day.'_start_time'])
);
return $i->punch_time->isAfter($startTime)
&& $i->punch_time->diffInMinutes($startTime) >= 5;
});
return view('hr.employeeLateReport.show', compact('latePunches'));
}
所以,我的问题在于我的急切加载,我无法解决这个问题。如果我取消注释快速加载员工中的过滤器,在靠近代码块末尾的过滤器块中,$i->employee 将变为未定义。如果省略过滤器,一切正常。我检查了正在生成的查询,一切看起来都很棒。
任何帮助将不胜感激。
这是关系方法
Employee.php
public function punches()
{
return $this->hasMany(EmployeePunch::class);
}
public function group()
{
return $this->belongsTo(Group::class);
}
public function department()
{
return $this->belongsTo(Department::class)->withDefault();
}
EmployeePunch.php
public function employee()
{
return $this->belongsTo(Employee::class);
}
SQL 输出
【问题讨论】:
-
您是否检查了这些查询的数据是否存在?
-
是的。我通过 laravel 调试栏找到了每个查询,并直接在数据库中运行它们,它们都按预期工作。
-
取消注释内部查询,然后尝试使用
whereHas('employee', function($q) {});和内部whereHas过滤器使用whereBetween -
当您在
employee.group和employee.department中获取其他嵌套关系时会发生什么?在employee闭包中尝试$query->with('group')->with('department')。 -
@FarrukhAyyaz 你能发表一个答案吗?您的评论使我得到了工作结果。谢谢。
标签: php laravel laravel-5 eloquent laravel-query-builder