使用多个参数进行雄辩过滤

时间:2018-05-24 13:54:11

标签: sql laravel eloquent

我正在编写一个搜索功能,它基本上会查找几个表。

数据库结构和关系如下:

`users`
id
name
user_type_id

`user_type`
id
type

`user_nicknames`
id
user_id
nickname

用户模型与\Illuminate\Database\Eloquent\Relations\BelongsTo

的关系user_type

\Illuminate\Database\Eloquent\Relations\HasMany

user_nicknames关系

我想要获得的是搜索特定的searchTerm,可以在users表格和user_nicknames

中找到

现在这个失败了:

 $user = $this->user->newQuery();

 $user->whereHas('userType', function ($query) use ($filters) {
                $query->where('type', $filters['type']);

        });

$user->whereHas('userNickName', function ($query) use ($searchTerm) {
            $query->where('custom_title', 'like', '%'.$nickname.'%');
        });

请注意,我更倾向于使用雄辩的关系而不是多个连接。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在您的用户模型中添加以下功能:

public function scopeUserTypeFilter($query, $filters)
{
    return $query->whereHas('user_type', function ($query) use ($filters) {
            $query->where('type', $filters['type']);
    });
}
public function scopeNicknameFilter($query, $nickname)
{
    return $query->whereHas('user_nick_name', function ($query) use ($searchTerm) {
        $query->where('custom_title', 'like', '%'.$nickname.'%');
    });
}

然后你可以在你的控制器上使用它们:

public function search(Request $reqeust)
{
    $users = User::where(function ($query) use ($request) {
        return $query->when($request->filled('s'), function($query) use ($request) {
            return $query->nicknameFilter($request->s);
     });
    })->where(function ($query) use ($request) {
        return $query->when($request->filled('userType'), function($query) use ($request){
            return $query->userTypeFilter($request->userType);
    });
    })->get();
}