2017-04-01 7 views
0

Ich habe 3 Modelle mit den Beziehungen many-to-many:3 Modelle many-to-many-Sync in Laravel 5.4

Modul

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

Rolle

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

Berechtigungstyp

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

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

Tabellen Beschreibung:

Module

id 
title 
status 

Rollen

id 
title 

permission_types

id 
title 

Pivot-Tabelle Berechtigungen

id 
role_id 
module_id 
permission_type_id 

Meine Synchronisation wie folgt aussieht:

QueryException in Conn

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

Beim Versuch, um die Synchronisation zu machen, haben einen Fehler ection.php Zeile 647: SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1066 Nicht eindeutige Tabelle/Alias: 'Berechtigungen' (SQL: Wählen Sie permissions. *, permissions. role_id als pivot_role_id, permissions. permission_id als pivot_permission_id von permissions innere Verbindung permissions auf permissions. id = permissions. permission_id wo permissions. role_id = 1)

Dank

Antwort

0

IMHO ein dreifach viele zu viele zu entwerfen versuchen, die nicht in Laravel nicht existiert. Die Lösung besteht in der Regel darin, der Pivot-Tabelle (in Ihrem Fall permissions) ein Modell zu geben (Permission im unteren Code), um hasManyThrough Relationen zu definieren.

Wenn ich gut Ihre Tabellenstruktur verstanden ich entwerfe die folgenden Beziehungen:

Modul

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

Rolle

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

Permission

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

Sag mir, wenn es für Sie arbeiten könnte.

+0

Danke. Können Sie mit einem Arbeitsbeispiel helfen, wie Sie jede Zeile der Pivot-Tabelle aktualisieren? –

+0

Ich fand es - http://stackoverflow.com/questions/27230672/laravel-synec-how-to-sync-an-array-and-also-pass-additional-pivot-fields. Angenommen, das ist mein Fall, aber oben ist ein Fehler aufgetreten –