我正在构建一个 Laravel API。我有两个模型,角色和权限,它们之间有多对多的关系。一个角色可以有多个权限,一个权限可以属于多个角色。我有一个数据透视permissions_roles表。
在前端,我有一个日期和状态过滤器以及搜索功能。我希望能够输入搜索关键字并能够在角色和权限表中搜索它。即,如果我输入 create,它应该与名称为“create”的角色匹配,或者显示在其权限之一中具有“create”的角色的结果。
这就是我所拥有的,但我没有得到想要的结果,特别是当我组合请求参数时。
$roles = Role::with('permissions','users');
if($request->search_term){
$roles->whereHas('permissions', function ($query) use ($request) {
$query->where('name', 'like', '%' . $request->search_term . '%');
})->orWhere('name', 'like', '%' . $request->search_term . '%');
}
$roles->when($request->status !== null, function (Builder $query) use ($request) {
$statuses = isIntegerOrCommaSeparatedInteger($request->status, 'statuses');
return $query->whereIn('active', $statuses);
});
$roles->when($request->start_date && $request->end_date, function (Builder $query) use ($request) {
return $query->whereBetween(
DB::raw('date(created_at)'),
[
Carbon::createFromDate($request->start_date)->toDateString(),
Carbon::createFromDate($request->end_date)->toDateString()
]
);
});
$roles = $roles->get();
有没有更好的方法可以实现这一点?
谢谢
谢谢马赫迪·拉希迪。那行得通。所以,万一有人遇到这个。我用 Mahdi 建议的内容替换了搜索查询。
$roles = Role::with('permissions', 'users');
if ($request->search_term) {
$roles->where(function ($q) use ($request) {
return $q->whereHas('permissions', function ($query) use ($request) {
$query->where('name', 'like', '%' . $request->search_term . '%');
})
->orWhere('name', 'like', '%' . $request->search_term . '%');
});
}
$roles->when($request->status !== null, function (Builder $query) use ($request) {
$statuses = isIntegerOrCommaSeparatedInteger($request->status, 'statuses');
return $query->whereIn('active', $statuses);
});
$roles->when($request->start_date && $request->end_date, function (Builder $query) use ($request) {
return $query->whereBetween(
DB::raw('date(created_at)'),
[
Carbon::createFromDate($request->start_date)->toDateString(),
Carbon::createFromDate($request->end_date)->toDateString()
]
);
});
$roles = $roles->get();
谢谢