Laravel雄辩的实时搜索过滤

时间:2020-10-27 10:21:08

标签: laravel eloquent

我正在尝试在服务器端进行搜索,并提出了这个雄辩的查询...

public function search(Request $request) {
    $data = User::with('instruments')
            ->where('user_type', 'teacher')
            ->orWhere('fname', 'like', '%' . $request->term . '%' )
            ->orWhere('fname', 'like', $request->term . '%' )
            ->orWhere('lname', 'like', '% ' . $request->term . '%' )
            ->orWhere('lname', 'like', $request->term . '%' )
            ->orWhere('email', 'like', '% ' . $request->term . '%' )
            ->orWhere('email', 'like', $request->term . '%' )
            ->orWhere('profession', 'like', '%' . $request->term . '%' )
            ->orWhere('profession', 'like', $request->term . '%' )
            ->limit(10)
            ->get();

        return response()->json($data);
}

我几乎达到了我想要的。例如,当我搜索john时,它会给我所有名称中带有john的用户。问题是,如果搜索正确并且知道我声明了where('user_type', 'teacher'),结果集仍然为我提供了student user_type

用户

1 个答案:

答案 0 :(得分:1)

问题在于OrWhere使user_type条件无效,这就是为什么当OrWhere条件之一适用时,它选择不是教师的用户的原因。

通过使用第二个带有闭包的位置,它将始终仅选择具有user_type老师的用户:

public function search(Request $request)
{
    $data = User::with('instruments')
        ->where('user_type', 'teacher')
        ->where(function ($query) use ($request) {
            $query->where('fname', 'like', '%' . $request->term . '%')
                ->orWhere('fname', 'like', $request->term . '%')
                ->orWhere('lname', 'like', '% ' . $request->term . '%')
                ->orWhere('lname', 'like', $request->term . '%')
                ->orWhere('email', 'like', '% ' . $request->term . '%')
                ->orWhere('email', 'like', $request->term . '%')
                ->orWhere('profession', 'like', '%' . $request->term . '%')
                ->orWhere('profession', 'like', $request->term . '%');
        })
        ->limit(10)
        ->get();

    return response()->json($data);
}