php - 正确的 Laravel 数据结构

标签 php mysql laravel orm relation

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

enter image description here

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

我遇到的问题如下:

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

最佳答案

这是一个抽象的想法:

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

在两个模型(“User”和“Book”)中,您需要创建如下方法:

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

现在,当您将用户绑定(bind)到图书时,请使用 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)

所以,当你绑定(bind)users <-> Books时通过保存book_id & user_idbook_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 .

关于php - 正确的 Laravel 数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33463028/

相关文章:

php - Symfony 不会自动增加 id

java - Hibernate 和 MariaDB auto_increment 未通过级联正确设置 FK

Laravel 中的 javascript 字符串本地化

mysql - 如果它的某些值是空的,如何按列排序查询?

php - 无法使用 Mysql 在 Laravel 中创建外键

php - Redis key 不会过期 - Laravel、Predis

PHP fatal error : Class 'CI_DB_postgre_driver' not found in system/database/DB. php 第 144 行 - CodeIgniter

php - SQLSTATE[42S22] : Column not found: 1054 Unknown column

php - 如果第一个参数在条件下为真,并且运算符将在下一次运行?

javascript - 如何在MySql中保存和读取特殊字符? (Mysqljs 和 Node )