我正在尝试为用户专门设置一个视图,该视图将其数据限制为仅显示通过多对多关系分配给他们的医生。这是原始代码:
$doctors = User::find(Auth::user()->id)
->doctors()
->orderBy($sortBy, $sort)
->paginate(10);
这很好。但是,我最近添加了如下搜索功能:
// search default
if ($request->search == null) {
$search = '';
} else {
$search = $request->search;
}
$doctors = User::find(Auth::user()->id)
->doctors()
->orderBy($sortBy, $sort)
->where('first_name', 'LIKE', '%' . $search . '%')
->orWhere('last_name', 'LIKE', '%' . $search . '%')
->orWhere('type', 'LIKE', '%' . $search . '%')
->orWhere('npi', 'LIKE', '%' . $search . '%')
->orWhere('license', 'LIKE', '%' . $search . '%')
->orWhere('dea', 'LIKE', '%' . $search . '%')
->paginate(10);
现在,从销售代表的角度来看,它显示了数据库中的所有医生。我假设使$search
返回'',它将覆盖User-> doctors()请求。如何保留搜索功能,但要确保医生仅限于归因于用户的医生?
答案 0 :(得分:1)
您需要对orWhere
子句进行分组,否则您将获得与用户和相关联的所有医生,其中first_name
类似于$search
OR ,其中所有医生的last_name
就像$search
。
尝试一下:
$doctors = User::find(Auth::user()->id)
->doctors()
->orderBy($sortBy, $sort)
->where(function ($query) use ($search) {
return $query->where('first_name', 'LIKE', '%' . $search . '%')
->orWhere('last_name', 'LIKE', '%' . $search . '%')
->orWhere('type', 'LIKE', '%' . $search . '%')
->orWhere('npi', 'LIKE', '%' . $search . '%')
->orWhere('license', 'LIKE', '%' . $search . '%')
->orWhere('dea', 'LIKE', '%' . $search . '%');
})
->paginate(10);
答案 1 :(得分:1)
您需要使用时间和位置分组
$search = $request->input('search');
$doctors = User::find(Auth::user()->id)
->doctors()
->when($search, function($query) use ($search){
$query->where(function ($query) use ($search) {
$query
->where('first_name', 'LIKE', '%' . $search . '%')
->orWhere('last_name', 'LIKE', '%' . $search . '%')
->orWhere('type', 'LIKE', '%' . $search . '%')
->orWhere('npi', 'LIKE', '%' . $search . '%')
->orWhere('license', 'LIKE', '%' . $search . '%')
->orWhere('dea', 'LIKE', '%' . $search . '%');
})
})
->orderBy('...')
->paginate(10);