我正在编写一个搜索功能,它基本上会查找几个表。
数据库结构和关系如下:
`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.'%');
});
请注意,我更倾向于使用雄辩的关系而不是多个连接。
有什么想法吗?
答案 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();
}