[英]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,权限
我想要得到的是:
我编写了一种方法来检查某个用户对笔记具有什么权限(在笔记模型中):
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.