首页 文章

雄辩有很多很多关系

提问于
浏览
0

我正在使用Eloquent ORM,我有一个 Category 模型,通过多对多关系连接到 Note 模型 . 我还有一个 User 模型,通过多对多关系连接到 Note 模型,并通过一对多关系连接到 Category 模型 .
数据库结构如下:
notes
id,title,content,created_at ....

categories
id, Headers ,描述

users
id,first_name,last_name ...

note_user
user_id,note_id,permission_id

category_note
category_id,note_id

note_permissions
permission_id,权限

我想要得到的:

  • 包含其ID与user_note表中的特定用户ID存在的注释的所有类别,并检查该行的permission_id .

  • 获取具有特定用户ID的user_note表中存在其ID的特定类别的所有注释,并检查该行的permission_id .

我写了一个方法来检查某个用户对一个笔记的权限(在 Note 模型中):

public function can($uid, $perm)
{
    $users = $this->users()->get();
    foreach ($users as $user) {
        if ($user->id == $uid) { // this user is shared
            $permId = $user->pivot->permission_id;
            $permissions = NotePerm::find($permId)->permissions;
            $perm = 'note.' . $perm;
            if (array_key_exists($perm, $permissions) && $permissions[ $perm ])
                return true;
        }
    }
    return false;
}

我的想法是获取包含某个用户可以看到的注释的所有类别(意味着user_note中有一行包含他的用户ID和属于此类别的注释ID) - 此方法放在 Category 模型中:

public function scopeWithNotesCan($query, $uid, $perm)
{
    return $query->whereHas('notes', function ($query) use ($uid, $perm) {
        $query->can($uid, $perm);
    });
}

这是电话:

$categories->WithNotesCan($this->user->id, 'view');

现在,我收到一个错误:

调用未定义的方法Illuminate \ Database \ Query \ Builder :: can()

在获取所有笔记之前,如何使用自定义方法检查每个笔记?

1 回答

  • 1

    通过使用多个whereHas完成它 . 在 Category 模型中,添加了以下范围:

    public function scopeForUser($query, $uid, $perm = 'view')
    {
        return $query->whereHas('notes', function ($query) use ($uid, $perm) {
            $query->forUser($uid, $perm)->orWhere('private', '=', false);
        });
    }
    

    Note 模型中,添加了以下范围:

    public function scopeForUser($query, $uid, $perm = 'view')
    {
        $permissions = NotePerm::findWhere($perm);
        return $query->whereHas('users', function ($query) use ($uid, $permissions) {
            $query->where('note_user.user_id', $uid)->whereIn('note_user.permission_id', $permissions)->orWhere('private', '=', false);
        });
    }
    

    findWhere NotePerm 方法获取包含特定权限字符串的所有权限的数组:

    public function scopeFindWhere($query, $perm = 'view')
    {
        $permissions = self::all();
        $perm = 'note.' . $perm;
        return $permissions->filter(function ($item) use ($perm) {
            return array_key_exists($perm, $item->permissions) && $item->permissions[ $perm ];
        })->lists('id')->toArray();
    }
    

    因此,要获取与特定用户共享的所有类别( $user 是类别的所有者,而不是我们要搜索的特定用户):

    $user->categories()->forUser($this->user->id, $perm);
    

    要获取与特定用户共享的特定类别的所有注释:

    $user->categories()->forUser($this->user->id, $perm)->notes()->forUser($this->user->id, $perm);
    

相关问题