我目前有这种结构,例如:
在此示例中,您可以看到可以将多个用户绑定到一本书或更多本书。
问题我的表现如下:
一本书只有一个主要拥有者。之后获得绑定的用户需要具有某些权限,例如编辑,删除等。在我提供的这种结构中处理这个问题的正确方法是什么?我是否需要将权限存储在数据透视表user_book中,或者是否有单独的表?
答案 0 :(得分:1)
Book
表格可能包含所有者的字段owner_id
(或user_id
),因此在这种情况下,您可以为图书及其创建one-to-one
关系。 ;老板。 Book
模型中的关系方法可能如下所示:
public function owner()
{
// Book belongs to one owner (User)
return $this->belongsTo('App\User', 'owner_id', 'id');
}
因此,$book->owner
将返回拥有该图书的所有者/用户。创建图书时需要设置owner_id
。反向关系为one-to-many
,因此在User
模型中,您需要创建books
方法,例如:
public function books()
{
// User has many books
return $this->hasMany('App\Book', 'owner_id', 'id');
}
因此,您可以致电User
模型:
$books = User::find(1)->books; // User::with('books')->find(1);
到目前为止,所有者和书籍的关系已经宣布。现在,对于拥有权限的用户,您可能需要使用数据透视表(当前结构)在many-to-many
和User
模型之间创建Book
关系,例如:
users -> book_user <- books
在这两种模式中(&#39;用户&#39;和#39; Book&#39;)您需要创建如下方法:
// In Book model
public function permittedUsers() // $book->permittedUsers
{
return $this->belongsToMany(
'App\User',
'book_user',
'book_id',
'user_id'
)->withPivot('permission');
}
// In User model (books is used for owner)
public function permittedBooks() // $user->permittedBooks
{
return $this->belongsToMany(
'App\Book',
'book_user',
'user_id',
'book_id'
)->withPivot('permission');
}
您的book_user
表格可能如下所示:
id | book_id | user_id | permission
现在,当您将用户绑定到书籍时,请使用Unix
系统的权限算法(类似但不相同)将权限级别保存在权限字段中。为此,首先,使用唯一的文件名在config
文件夹中创建配置文件,您可以使用book.php
并声明/返回以下数组:
// config/book.php
return [
'editable' => 1,
'deletable' => 2,
'all' => 3
];
算法:
if permission value == 1 then user can edit the book
if permission value == 2 then user can delete the book
if permission value == 3 then user can do both (1+2=3)
因此,当您通过保存users <-> Books
&amp;绑定book_id
时user_id
数据透视表中的book_user
,还会在权限字段中保存权限级别。为此,您可以使用复选框并将复选框的值设置为权限值,例如;
<input name="permission[]" type="checkbox" value=1 /> Edit
<input name="permission[]" type="checkbox" value=2 /> Delete
提交表单时,只需检查permission
是否已设置,然后加上/添加以下值:
// if(isset('permission'))
if($permission = Request::get('permission')) {
$permissionLevel = array_sum($permission);
}
// otherwise invalid data, at least 1 permission must be given
将数据透视表数据(包括$permissionLevel
)保存在数据透视表中。因此,当您需要检查用户的Book
权限时,您可以检查权限字段是否与book_permission表中的某个值匹配。因此,您可以使用以下内容轻松检查:
if($user->permittedBooks->first()->pivot->permission == config('book.edit')) {
// Can edit the book
}
if($user->permittedBooks->first()->pivot->permission == config('book.all')) {
// Can do everything
}
这就是全部,这是一个想法。可能还有其他方式。您还可以检查this article以获得另一个想法,这是关于系统明智的ACL
但可能有帮助。您也可以查看Unix Permissions Calculator。