Laravel spatie 权限很多吗?查询

问题描述 投票:0回答:1

我有两个表:日程表和任务,具有一对一关系

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。

php laravel eloquent permissions
1个回答
0
投票

使用 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();

© www.soinside.com 2019 - 2024. All rights reserved.