我正在使用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 回答
通过使用多个whereHas完成它 . 在 Category 模型中,添加了以下范围:
在 Note 模型中,添加了以下范围:
findWhere NotePerm 方法获取包含特定权限字符串的所有权限的数组:
因此,要获取与特定用户共享的所有类别( $user 是类别的所有者,而不是我们要搜索的特定用户):
要获取与特定用户共享的特定类别的所有注释: