在Laravel中使用第三个表搜索多个输入



我有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_idReportStatus有关系等。

这是我的搜索控制器:
$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可以返回intnull,您可以使用雄辩的构建器重构您的查询,如:

$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

相关内容

  • 没有找到相关文章

最新更新