Laravel通过多对多关系限制结果

时间:2018-11-16 15:52:48

标签: laravel

我正在尝试为用户专门设置一个视图,该视图将其数据限制为仅显示通过多对多关系分配给他们的医生。这是原始代码:

$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()请求。如何保留搜索功能,但要确保医生仅限于归因于用户的医生?

2 个答案:

答案 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);