Как определить отношение в модели laravel 5.3 eloquent?

#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);
    }
}