Php 正确的数据结构

Php 正确的数据结构,php,mysql,laravel,orm,relation,Php,Mysql,Laravel,Orm,Relation,我目前有这样的结构,例如: public function books() { // User has many books return $this->hasMany('App\Book', 'owner_id', 'id'); } users -> book_user <- books 在本例中,您可以看到可以将多个用户绑定到一本或多本书 我要解释的问题如下: 一本书只有一个主要所有者。之后获得绑定的用户需要具有某些权限,如编辑、删除等。在我提供的这个

我目前有这样的结构,例如:

public function books()
{
    // User has many books
    return $this->hasMany('App\Book', 'owner_id', 'id');
}
users -> book_user <- books

在本例中,您可以看到可以将多个用户绑定到一本或多本书

我要解释的问题如下:

一本书只有一个主要所有者。之后获得绑定的用户需要具有某些权限,如编辑、删除等。在我提供的这个结构中,正确的处理方法是什么?我需要将权限存储在pivot table user_book中,还是需要一个单独的表?

这里有一个抽象的想法:
Book
表可能包含一个所有者字段,作为
owner\u id
(或
user\u id
),因此在这种情况下,您可以为Book及其所有者创建一对一的关系。
Book
模型中的关系方法可能如下所示:

public function owner()
{
    // Book belongs to one owner (User)
    return $this->belongsTo('App\User', 'owner_id', 'id');
}
因此,
$book->owner
将返回拥有该书的所有者/用户。创建书籍时需要设置
所有者id
。反向关系将是一对多,因此在
用户
模型中,您需要创建
书籍
方法,例如:

public function books()
{
    // User has many books
    return $this->hasMany('App\Book', 'owner_id', 'id');
}
users -> book_user <- books
因此,从
用户
模型中,您可以调用:

$books = User::find(1)->books; // User::with('books')->find(1);
到目前为止,所有者和账簿关系已经声明。现在,对于具有权限的用户,您可能需要使用透视表(当前结构)在
用户
书籍
模型之间创建
多对多
关系,例如:

public function books()
{
    // User has many books
    return $this->hasMany('App\Book', 'owner_id', 'id');
}
users -> book_user <- books
您的
book\u用户
表可能如下所示:

// 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');
}
id | book_id | user_id | 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
}
现在,当您将用户绑定到书籍时,请使用
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)
因此,当您通过在
book\u user
透视表中保存
book\u id
user\u id
来绑定
users book
时,还要在permission字段中保存权限级别。为此,您可以使用复选框并将复选框的值设置为权限值,例如

<input name="permission[]" type="checkbox" value=1 /> Edit
<input name="permission[]" type="checkbox" value=2 /> Delete
在透视表中保存透视数据,包括
$permissionLevel
。因此,当需要检查用户的
Book
权限时,可以检查权限字段是否与Book\u权限表中的某个值匹配。因此,您可以使用以下内容轻松检查:

// 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');
}
id | book_id | user_id | 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
}

就这些,这是一个想法。可能还有其他方法。您也可以查看以获得另一个想法,这是关于系统方面的
ACL
,但可能会有所帮助。您也可以进行检查。

您可以将其存储在透视表中或某些全局角色/权限系统中。