php - Correct data structure Laravel -


i have structure example:

enter image description here

in example, can see possible bind multiple users, 1 book or more.

problem expierincing follows:

there's 1 main owner of book. users bind afterwards need have permissions, edit, delete etcetera. correct way of dealing in structure providing? need store permissions in pivot table user_book, or have seperate table?

here abstract idea:

the book table may contain field owner owner_id (or user_id) in case can create one-to-one relationship book , it's owner. method relationship in book model might like:

public function owner() {     // book belongs 1 owner (user)     return $this->belongsto('app\user', 'owner_id', 'id'); } 

so, $book->owner return owner/user owns book. owner_id needs set when creating book. reverse relation one-to-many in user model need create books method example:

public function books() {     // user has many books     return $this->hasmany('app\book', 'owner_id', 'id'); } 

so, user model can call:

$books = user::find(1)->books; // user::with('books')->find(1); 

so far owner , book relationship has been declared. users permissions may need create many-to-many relationship between user , book model using pivot table (your current structure), example:

users -> book_user <- books 

in both models ('user' , 'book') need create method this:

// 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 used owner) public function permittedbooks() // $user->permittedbooks {     return $this->belongstomany(         'app\book',         'book_user',         'user_id',         'book_id'     )->withpivot('permission'); } 

your book_user table may this:

id | book_id | user_id | permission 

now, when bind users books, save access level in permission field using unix system's permission algorithm (similar not same). this, @ first, create config file in config folder using unique file name, may use book.php , declare/return following array:

// config/book.php return [     'editable' => 1,     'deletable' => 2,     'all' => 3 ]; 

the algorithm:

if permission value == 1 user can edit book if permission value == 2 user can delete book if permission value == 3 user can both (1+2=3) 

so, when bind users <-> books saving book_id & user_id in book_user pivot table, save permission level in permission field. achieve this, may use check boxes , set value of check boxes permission's value, example;

<input name="permission[]" type="checkbox" value=1 /> edit <input name="permission[]" type="checkbox" value=2 /> delete 

when submitting form, check if permission set , sum/addition values like:

// if(isset('permission')) if($permission = request::get('permission')) {     $permissionlevel = array_sum($permission); }  // otherwise invalid data, @ least 1 permission must given 

save pivot data including $permissionlevel in pivot table. so, when need check book's permissions user, may check if permission field matches value in book_permission table. result can check using this:

if($user->permittedbooks->first()->pivot->permission == config('book.edit')) {     // can edit book }  if($user->permittedbooks->first()->pivot->permission == config('book.all')) {     // can } 

that's , it's idea. there other ways. may check this article idea, system wise acl helpfull. may check unix permissions calculator.


Comments

Popular posts from this blog

javascript - Slick Slider width recalculation -

jsf - PrimeFaces Datatable - What is f:facet actually doing? -

angular2 services - Angular 2 RC 4 Http post not firing -