public function getEmployees(Request $request, Project $project)
{
$users = $project->users()
->ByRole($request->get('role'))
->orderBy('id', 'desc')
->paginate(request('limit', 10));
return UserResource::collection($users);
}
public function scopeByRole($query, $role)
{
if(!is_array($role)){
$role = [$role];
}
return $query->when($role, function($query, $role){
return $query->whereIn('role', $role);
});
}
public function getEmployees(Request $request, Project $project)
{
$users = $project->users()
->when($request->get('role'), function($query, $role){
return $query->ByRole($role);
})
->orderBy('id', 'desc')
->paginate(request('limit', 10));
return UserResource::collection($users);
}
Промежуточная модель к pivot таблице тоже иногда может быть нужна если к связке нужно что то привязать. Например в том проекте что я пишу у меня есть связь пробирка с операцией над ней - и к этой связи надо привязать используемые реагенты и еще кучу всего - и я завел через using модель pivot таблицы
То что вы пытаетесь сделать - называется один ко многим. Вы прописываете связку model Project -> model ProjectUser -> model User.
public function users()
{
return $this->belongsToMany(User::class, 'project_users', 'user_id', 'project_id');
}
Зачем вам доп модель ProjectUser для belongsToMany?
"SQLSTATE[42S02]: Base table or view not found: 1146 Table 'db-admin.project_project_user' doesn't exist (SQL: select `project_users`.*, `project_project_user`.`project_id` as `pivot_project_id`, `project_project_user`.`project_user_id` as `pivot_project_user_id` from `project_users` inner join `project_project_user` on `project_users`.`id` = `project_project_user`.`project_user_id` where `project_project_user`.`project_id` = 1 and `project_users`.`id` = 2 limit 1)"
class ProjectController extends Controller
{
/**
* Create the controller instance.
*
* @return void
*/
public function __construct()
{
$this->authorizeResource(Project::class, 'project');
}
}
А в первом я смогу показать любое меню при любом вызове существующего для данного пользователя проекта.
Вопрос наверно такой: использовать второй вариант совместно с методом findOrFail или на уровне policy решить данную проблему?
Если брать policy, придется закидывать policy проекта в policy menu? (т. к. в ProjectPolicy проверяется соотвествие модели пользователя и проекта; а здесь требуется дополнительно проверить соответствие проекта и меню)