繁体   English   中英

雄辩的多对多关系

[英]Eloquent Many to many relationship

我正在使用Eloquent ORM,并且我有一个Category模型,该模型通过多对多关系连接到Note模型。 我也有一个User模型,它通过多对多关系连接到Note模型,并通过一对多关系连接到Category模型。
数据库结构如下:
笔记
ID,标题,内容,created_at ...

分类
ID,标题,描述

使用者
ID,名字,姓氏...

note_user
user_id,note_id,permission_id

category_note
category_id,note_id

note_permissions
Permission_ID,权限

我想要得到的是:

  1. 包含便笺的所有类别,这些便笺的ID都存在于user_note表中,并带有特定的用户ID,并检查该行的Permission_id。
  2. 获取具有特定ID的user_note表中存在其ID的特定类别的所有注释,并检查该行的Permission_id。

我编写了一种方法来检查某个用户对笔记具有什么权限(在笔记模型中):

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()

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

通过使用多个whereHas实现。 类别模型中,添加以下范围:

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

在“ 注释”模型中,添加了以下范围:

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM