В настоящее время у меня есть эта структура, например:
В этом примере вы можете видеть, что можно привязать нескольких пользователей к одной или нескольким книгам.
Проблема, с которой я сталкиваюсь, заключается в следующем:
Там только 1 основной владелец книги. Пользователи, которые впоследствии получают привязку, должны иметь определенные разрешения, такие как редактирование, удаление и так далее. Как правильно решить эту проблему в этой структуре, которую я предоставляю? Нужно ли мне хранить разрешения в сводной таблице 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
В обеих моделях («Пользователь» и «Книга») вам необходимо создать такой метод:
// 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.
Других решений пока нет …