Правильная структура данных Laravel

В настоящее время у меня есть эта структура, например:

введите описание изображения здесь

В этом примере вы можете видеть, что можно привязать нескольких пользователей к одной или нескольким книгам.

Проблема, с которой я сталкиваюсь, заключается в следующем:

Там только 1 основной владелец книги. Пользователи, которые впоследствии получают привязку, должны иметь определенные разрешения, такие как редактирование, удаление и так далее. Как правильно решить эту проблему в этой структуре, которую я предоставляю? Нужно ли мне хранить разрешения в сводной таблице user_book или иметь отдельную таблицу?

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

В обеих моделях («Пользователь» и «Книга») вам необходимо создать такой метод:

// 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 сохраняя 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
}

Вот и все, и это идея. Могут быть и другие способы. Вы также можете проверить Эта статья чтобы получить другую идею, которая о системе мудрый ACL но может быть полезным. Вы также можете проверить Unix Permissions Calculator.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]