我有3个表,这些表之间有一些关系。
表1:报告{id, date, employee_id}
public function employee()
{
return $this->belongsTo(Employee::class, "employee_id", "id");
}
表2:员工{id, name, department_id}
public function department()
{
return $this->belongsTo(Department::class);
}
public function report()
{
return $this->hasMany(Report::class, "employee_id", "id");
}
表3:科室{id, name}
public function employee()
{
return $this->hasMany(Employee::class);
}
这就是问题所在,我想在报告表中搜索多个输入,如
2个日期字段在日期之间进行过滤:start TO end
1个employee id
输入
1输入department_id
,它继续处理其他输入,但不需要列出所有输入,因为它们与Reports表之间只有一个关系。例如,report_status_id
与ReportStatus
有关系等。
$reports = DB::table('reports')
->leftJoin('employees', 'employees.id', '=', 'reports.employee_id')
->leftJoin('departments', 'departments.id', '=', 'employees.department_id')
->whereBetween('date', [$request->start_date, $request->end_date])
->where([
['employee_id', $request->employee_id],
['report_status_id', $request->report_status_id],
])
->orWhere('department_id', $request->department_id)
->get();
我没有控制哪个用户的输入已经被填充。但这是问题:如果用户只填写department
输入搜索,正如你可以猜到的,我必须列出该部门的所有报告,但由于没有任何关于员工的信息,结果变得不一致。
例如,如果用户选择ONLYIncoming
部门,则返回1484
结果。但是如果用户选择日期在2022-01-01 TO 2022-02-01
之间的Incoming
部门,则返回1512
结果,这是不可能的。你可以想象它应该缩小范围。
我知道我的搜索逻辑是不正确的,只是添加到显示一些东西,但我认为你理解我的问题。我如何组织逻辑并得到一致的结果?我愿意接受任何一种解决办法。
谢谢你的建议。
由于$request->department_id
可以返回int
或null
,您可以使用雄辩的构建器重构您的查询,如:
$query = Report::query();
if($request->start_date && $request->end_date){
$query->whereBetween('date', [$request->start_date, $request->end_date]);
} else if ($request->start_date && $request->end_date === null){
$query->where('date', '>=', $request->start_date)
} else if ($request->start_date === null && $request->end_date){
$query->where('date', '=<', $request->end_date)
}
if($request->employee_id){
$query->where('employee_id', '=', $request->employee_id);
}
if($request->request_status_id){
$query->where('request_status_id', '=', $request->request_status_id);
}
if($request->department_id){
$departmentId = $request->department_id;
$query->with('employee')
->orWhereHas('employee', function (Builder $q) use ($departmentId): void {
$q->where('department_id', '=', $departmentId)
});
}
$result = $query->get(); //$result now has collection