2017-04-01 63 views
0

同步我有3種型號,許多一對多的關係:3種型號多到很多Laravel 5.4

模塊

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

當試圖實現同步,有一個錯誤在康涅狄格州

QueryException ection.php line 647: SQLSTATE [42000]:語法錯誤或訪問衝突:1066非唯一表/別名:'permissions'(SQL:select permissions。*,permissionsrole_id as pivot_role_idpermissionspermission_id as pivot_permission_id from permissions inner join permissions on permissionsid = permissionspermission_id其中permissionsrole_id = 1)

感謝

回答

0

恕我直言,你想設計出三倍多到不存在Laravel許多。解決方案通常是爲了定義hasManyThrough關係,給出數據透視表(在您的案例中爲permissions)Model(權限,代碼如下)。

如果我深知你的表結構,我會設計瞭如下關係:

模塊

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

PermissionType

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

權限

​​

告訴我,如果它可以爲你工作。

+0

謝謝。你能幫助一個工作的例子,如何更新數據透視表的每一行? –

+0

我發現它 - http://stackoverflow.com/questions/27230672/laravel-sync-how-to-sync-an-array-and-also-pass-additional-pivot-fields。假設,這是我的情況,但上面有一個錯誤 –