Я разрабатываю роль и разрешения на основе структуры laravel.
У меня 3 модели:
Weblog
User
Permissions
это сводная таблица
user_id , weblog_id , permission_id
Теперь у пользователя может быть блог с идентификатором разрешения 1,2 и другой блог с разрешением 1,2,3,4.
Как я могу развернуть отношения? и как я могу проверить права пользователя при управлении блогом. (промежуточное ПО и ...)
Является ли связь между пользователем и веб-журналом «один-ко-многим» или «многие-ко-многим» — означает, может ли одна запись веб-журнала быть связана с несколькими пользователями или одна запись веб-журнала связана только с одним пользователем.
Отношение @Donkarnash между веб-журналом и пользователем — «многие ко многим».
какой код вы используете?
С тем фактом, что Разрешение специфично для Веблога
Скажем, сводная таблица называется permission_user_weblog
class User extends Model
{
public function weblogs()
{
return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
}
public function permissionsFor(int $weblogId)
{
$permissionIds = null;
$this->weblogs()
->where('id', $weblogId)
->with('permissions')
->get()
->each(function($weblog) use(&$permissionIds) {
$permissionIds = $weblog->permissions->pluck('id');
});
return $permissionIds;
}
}
class Weblog extends Model
{
public function users()
{
return $this->belongsToMany(User::class, 'permission_user_weblog');
}
public function permissions()
{
return $this->belongsToMany(Permission::class, 'permission_user_weblog');
}
}
class Permission extends Model
{
public function weblogs()
{
return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
}
}
Затем вы можете проверить в любом месте, есть ли у вошедшего в систему пользователя определенное разрешение для определенного блога.
public function update(Request $request, $weblogId)
{
$user = auth()->user();
$permissions = $user->permissionsFor($weblogId);
//Check whether the logged in user has permission identified by id 1 or 4 for weblog
$can = !! $permissions->intersect([1,4])->count();
//Do rest of processing
}
спасибо за это решение, я работаю над этим, и я обновлю здесь.
ваш блог, пользователь, разрешение имеет отношение ManyToMany, это немного странно, но если вы хотите иметь такое отношение, это не проблема.
просто рассмотрите каждую пару как ManyToMany. и каждый из них также может иметь hasMany для Pivot (я назвал его Access) (в зависимости от ваших потребностей).
Пользовательская модель:
class User extends Model{
/**
* retrive weblogs
*
* @return BelongsToMany weblogs
*/
public function weblogs()
{
return $this->belongsToMany(App\WebLog::class,'accesses_table')
->withPivot("permission_id")
->using(App\Access::class);
}
/**
* retrive permissions
*
* @return BelongsToMany permissions
*/
public function permissions()
{
return $this->belongsToMany(App\Permission::class,'accesses_table')
->withPivot("weblog_id")
->using(App\Access::class);
}
/**
* retrive access
*
* @return hasMany [description]
*/
public function accesses()
{
return $this->hasMany(App\Access::class, "user_id");
}
}
Модель блога:
class Weblog extends Model{
/**
* retrive users
*
* @return BelongsToMany users
*/
public function users()
{
return $this->belongsToMany(App\User::class,'accesses_table')
->withPivot("permission_id")
->using(App\Access::class);
}
/**
* retrive permissions
*
* @return BelongsToMany permissions
*/
public function permissions()
{
return $this->belongsToMany(App\Permission::class,'accesses_table')
->withPivot("user_id")
->using(App\Access::class);
}
/**
* retrive access
*
* @return hasMany [description]
*/
public function accesses()
{
return $this->hasMany(App\Access::class, "weblog_id");
}
}
Модель разрешения:
class Permission extends Model{
/**
* retrieve users
*
* @return BelongsToMany users
*/
public function users()
{
return $this->belongsToMany(App\User::class,'accesses_table')
->withPivot("weblog_id")
->using(App\Access::class);
}
/**
* retrieve weblogs
*
* @return BelongsToMany weblogs
*/
public function weblogs()
{
return $this->belongsToMany(App\Weblog::class,'accesses_table')
->withPivot("user_id")
->using(App\Access::class);
}
/**
* retrive access
*
* @return hasMany [description]
*/
public function accesses()
{
return $this->hasMany(App\Access::class, "permission_id");
}
}
и у вас может быть модель для вашего свода, которую я назвал Access:
Illuminate\Database\Eloquent\Relations\Pivot;
class Access extends Pivot
{
public $incrementing = true;
public function user()
{
return $this->belongsTo(App\User::class);
}
public function weblog()
{
return $this->belongsTo(App\Weblog::class);
}
public function permission()
{
return $this->belongsTo(App\Permission::class);
}
}
Я могу ошибаться, но я думаю, что лучше всего рассматривать сводную таблицу как модель. Таким образом, вы можете определить отношения 1:n между этими моделями.