【问题标题】:How to define relation in laravel 5.3 eloquent model?如何在 laravel 5.3 雄辩模型中定义关系?
【发布时间】:2017-02-16 16:48:57
【问题描述】:

我的数据库架构中有如下表,

是数据透视表吗?

如何在 eloquent 模型中定义关系?

    class Role extends Model {

    public $timestamps = false;

    public function permissions() {
        return $this->hasMany('App\Models\RolePermission', 'permissions_id');
    }

}

这是定义关系的正确方法吗?请帮我理解。

    class RolePermission extends Model {

    public $timestamps = false;

    public function role() {
        return $this->belongsTo('App\Models\Role', 'roles_id');
    }

}

【问题讨论】:

标签: php mysql laravel model laravel-5.3


【解决方案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(App\Permission::class);
    }
}

当然是你的权限类

class Permission {
    public function role() {
        return $this->belongsToMany(App\Role::class);
    }
}

【讨论】:

  • 如果是多对多,为什么一个hasMany 而另一个belongsToMany?这有点暗示多对多关系根据您从哪一侧看到而有所不同。
  • laracasts/generators 使创建数据透视表更容易。
【解决方案2】:

它通过数据透视表 Permission_Role 将多对多关系联系在一起。那里的每个表 belongsToMany 没有 hasOne 或 hasMany

class Role {
    public function permissions() {
        return $this->belongsToMany(App\Permission::class);
    }
}

class Permission {
    public function role() {
        return $this->belongsToMany(App\Role::class);
    }
}

【讨论】:

    猜你喜欢
    • 2017-05-19
    • 1970-01-01
    • 2019-02-12
    • 2013-06-04
    • 2016-11-26
    • 1970-01-01
    • 2017-04-07
    • 2018-02-19
    相关资源
    最近更新 更多