我有两个表:日程表和任务,具有一对一关系
class Schedule extends Model
{
public function task() {
return $this->belongsTo(Task::class, 'task_id');
}
任务模型与带有task_role数据透视表的Spatie角色具有一对多关系:
class Task extends Model
{
public function roles() {
return $this->belongsToMany(Role::class);
}
如何进行查询来检索与具有登录用户权限的任务关联的所有计划?
例如: 任务:
id | 名字 |
---|---|
1 | 任务1 |
2 | 任务2 |
3 | 任务3 |
任务角色:
任务ID | 角色_id |
---|---|
1 | 1 |
2 | 3 |
3 | 1 |
时间表:
id | 名字 | 任务id |
---|---|---|
1 | 日程1 | 1 |
2 | 日程2 | 1 |
3 | 日程3 | 5 |
Spatie model_has_roles:
角色_id | 模型类型 | 型号_id |
---|---|---|
1 | 应用\模型\用户 | 2 |
2 | 应用\模型\用户 | 1 |
3 | 应用\模型\用户 | 5 |
当用户 2 登录时,他应该只能看到时间表 1 和 2。
使用 hasManyThrough 是理想的选择,但这意味着对您的架构进行一些修改。 但是,您可以通过链接 Eloquent 关系和自定义查询来实现此结果。 对于您的示例,您可以通过
执行此操作获取用户的所有角色 ID,然后获取与这些角色关联的所有任务,最后根据此 ID 制定更适合的计划。
或者您可以为用户定义自定义方法来执行相同的操作。
带有代码的示例。
// In your Schedule model
public static function getSchedulesForUser($user)
{
// Get the role IDs of the user
$roleIds = $user->roles()->pluck('id');
// Get tasks associated with these roles using Eloquent relationship
$tasks = Task::whereHas('roles', function ($query) use ($roleIds) {
$query->whereIn('id', $roleIds);
})->get();
// Extract task IDs from the tasks collection
$taskIds = $tasks->pluck('id');
// Return the schedules associated with these tasks
return self::whereIn('task_id', $taskIds)->get();
}
或
//in your User model
public function schedules()
{
// Get role IDs
$roleIds = $this->roles()->pluck('roles.id');
// Get task IDs associated with these roles
$taskIds = Task::whereHas('roles', function ($query) use ($roleIds) {
$query->whereIn('roles.id', $roleIds);
})->pluck('tasks.id');
// Return schedules associated with these tasks
return Schedule::whereIn('task_id', $taskIds)->get();
}
或
//directly in your controller
// Get the logged-in user
$user = Illuminate\Support\Facades\Auth::user();
// Get the role IDs of the logged-in user
$roleIds = $user->roles->pluck('id');
// Get the task IDs associated with these roles
$taskIds = DB::table('task_role')
->whereIn('role_id', $roleIds)
->pluck('task_id');
// Get the schedules associated with these tasks
$schedules = Schedule::whereIn('task_id', $taskIds)->get();