【问题标题】:3 models many-to-many sync in Laravel 5.4Laravel 5.4 中的 3 个模型多对多同步
【发布时间】:2017-08-26 23:45:38
【问题描述】:

我有 3 个具有多对多关系的模型:

模块

public function permissionTypes()
{
    return $this->belongsToMany(PermissionType::class, 'permissions')->withPivot('role_id');
}

public function roles()
{
    return $this->belongsToMany(Role::class, 'permissions')->withPivot('permission_type_id');
}

角色

public function permissionTypes()
{
    return $this->belongsToMany(PermissionType::class, 'permissions')->withPivot('module_id');
}

public function modules()
{
    return $this->belongsToMany(Module::class, 'permissions')->withPivot('permission_type_id');
}

权限类型

public function roles() 
{
    return $this->belongsToMany(Role::class, 'permissions')->withPivot('module_id');
}

public function modules()
{
    return $this->belongsToMany(Module::class, 'permissions')->withPivot('role_id');
}

表格说明:

模块

id
title
status

角色

id
title

permission_types

id
title

数据透视表权限

id
role_id
module_id
permission_type_id

我的同步看起来像:

//array of ids from request to synchronization 
$permissions = $request['permissions'];

//role by id from request
$role = Role::findOrFail((int)$roleId);

//module by id from request
$module = Module::findOrFail((int)$moduleId);

//synchronization
$pivotData = array_fill(0, count($permissions), ['role_id' => $role->id]);
$syncData  = array_combine($permissions, $pivotData);
$module->permissionTypes()->sync($syncData);

尝试同步时出错

Connection.php 第 647 行中的 QueryException: SQLSTATE[42000]: 语法错误或访问冲突: 1066 Not unique table/alias: 'permissions' (SQL: select permissions.*, permissions.role_id as pivot_role_id, permissions.permission_id作为pivot_permission_id 从permissions 内部连接permissions 在permissions.id = permissions.permission_id 其中permissions.role_id = 1)

谢谢

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    恕我直言,您正在尝试设计 Laravel 中不存在的三重多对多。解决方案通常是为数据透视表(在您的情况下为 permissions)提供一个模型(Permission 在下面的代码中)用于定义 hasManyThrough 关系。

    如果我理解你的表结构,我会设计以下关系:

    模块

    public function permissions()
    {
        return $this->hasMany(Permission::class);
    }
    public function roles()
    {
        return $this->hasManyThrough(Role::class, Permission::class);
    }
    public function permissionTypes()
    {
        return $this->hasManyThrough(PermissionType::class, Permission::class);
    }
    

    角色

    public function permissions()
    {
        return $this->hasMany(Permission::class);
    }
    public function permissionTypes()
    {
       return $this->hasManyThrough(PermissionType::class, Permission::class);
    }   
    public function modules()
    {
        return $this->hasManyThrough(Module::class, Permission::class);
    }
    

    权限类型

    public function permissions()
    {
        return $this->hasMany(Permission::class);
    }
    public function modules()
    {
        return $this->hasManyThrough(Module::class, Permission::class);
    }
    public function roles()
    {
       return $this->hasManyThrough(Role::class, Permission::class);
    }
    

    权限

    public function permissionType()
    {
        return $this->belongsTo(PermissionType::class);
    }
    public function role()
    {
        return $this->belongsTo(Role::class);
    }
    public function module()
    {
        return $this->belongsTo(Module::class);
    }
    

    告诉我它是否适合你。

    【讨论】:

    • 谢谢。您能否提供一个工作示例,如何更新数据透视表的每一行?
    • 我找到了——stackoverflow.com/questions/27230672/…。假设,这是我的情况,但上面有一个错误
    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2021-05-25
    • 2017-06-18
    • 1970-01-01
    • 2021-10-31
    相关资源
    最近更新 更多