#php #mysql #laravel #model #laravel-5.3
#php #mysql #laravel #Модель #laravel-5.3
Вопрос:
У меня есть таблицы в моей схеме базы данных следующим образом,
Это сводная таблица?
Как я могу определить отношение в eloquent model?
class Role extends Model {
public $timestamps = false;
public function permissions() {
return $this->hasMany('AppModelsRolePermission', 'permissions_id');
}
}
Это правильный способ определения отношения? Пожалуйста, помогите мне понять.
и
class RolePermission extends Model {
public $timestamps = false;
public function role() {
return $this->belongsTo('AppModelsRole', 'roles_id');
}
}
Комментарии:
1. Смотрите laravel.com/docs/5.3/eloquent-relationships#many-to-many
Ответ №1:
Проблема в том, что вам нужно назвать свою таблицу permission_role
, чтобы следовать прагме проектирования.
Схема ролей
Schema::create('roles', function(Blueprint $table){
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Схема разрешений
Schema::create('permissions', function(Blueprint $table){
$table->increments('id');
$table->string('name');
$table->timestamps();
});
Тогда вам просто нужна permission_role
таблица:
Схема Permission_Role
Schema::create('permission_role', function(Blueprint $table){
$table->increments('id');
$table->integer('permission_id')->unsigned();
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
$table->integer('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
});
Затем вы просто настраиваете свои модели следующим образом:
class Role {
public function permissions() {
return $this->hasMany(AppPermission::class);
}
}
Тогда, конечно, ваш класс разрешений
class Permission {
public function role() {
return $this->belongsToMany(AppRole::class);
}
}
Комментарии:
1. Если это много-ко-многим, почему одно
hasMany
и другоеbelongsToMany
? Это как бы подразумевает, что отношение «многие ко многим» отличается в зависимости от того, с какой стороны вы его видите.2. laracasts / generators упрощает создание сводных таблиц.
Ответ №2:
это связь «многие ко многим», связанная сводной таблицей Permission_Role. там для каждой таблицы принадлежит множество, а не hasOne или hasMany
class Role {
public function permissions() {
return $this->belongsToMany(AppPermission::class);
}
}
class Permission {
public function role() {
return $this->belongsToMany(AppRole::class);
}
}