【问题标题】:Correct data structure Laravel正确的数据结构 Laravel
【发布时间】:2015-11-01 14:07:40
【问题描述】:

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

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

我遇到的问题如下:

一本书只有一个主要所有者。之后绑定的用户需要有一定的权限,比如编辑、删除等。在我提供的这种结构中处理这个问题的正确方法是什么?我需要将权限存储在数据透视表 user_book 中,还是有一个单独的表?

【问题讨论】:

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

标签: php mysql laravel orm relation


【解决方案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);

到目前为止,所有者和书籍的关系已被声明。现在对于具有权限的用户,您可能需要使用数据透视表(您当前的结构)在 UserBook 模型之间创建 many-to-many 关系,例如:

users -> book_user <- books

在这两个模型(“用户”和“书”)中,您需要创建这样的方法:

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

因此,当您通过在book_user 数据透视表中保存book_iduser_id 来绑定users &lt;-&gt; Books 时,还要在权限字段中保存权限级别。为此,您可以使用复选框并将复选框的值设置为权限的值,例如;

<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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多