2016-08-19 10 views
2

Ich verwende Laravel 5.2 und ich habe Rollen- und Berechtigungsmodelle mitändern Laravel Beziehung Ausgabestruktur

Role.php

public function permissions() 
{ 
    return $this->hasMany('App\Permissions'); 
} 

Und wenn ich

return Role::with('permissions')->get() 

nennen es wird zurückkehren

[{ 
     "id": 2, 
     "name": "training_vendor", 
     "display_name": "Training Vendor", 
     "description": "Role for vendor", 
     "created_at": "2016-06-23 08:05:47", 
     "updated_at": "2016-06-23 08:05:47", 
     "permissions": [ 
     { 
      "permission_id": 1, 
      "role_id": 2 
     }, 
     { 
      "permission_id": 2, 
      "role_id": 2 
     }, 
     { 
      "permission_id": 3, 
      "role_id": 2 
     }, 
     { 
      "permission_id": 4, 
      "role_id": 2 
     }, 
     { 
      "permission_id": 5, 
      "role_id": 2 
     } 
}] 

Ist es möglich, die Struktur "Berechtigungen" in etwas wie diese zu ändern?

[{ 
     "id": 2, 
     "name": "training_vendor", 
     "display_name": "Training Vendor", 
     "description": "Role for vendor", 
     "created_at": "2016-06-23 08:05:47", 
     "updated_at": "2016-06-23 08:05:47", 
     "permissions": [1,2,3,4,5]    
}] 
+0

Die beste Möglichkeit wäre, die Sammlung zu mappen und die Permissions-Eigenschaft zu ändern. –

Antwort

0

Wenn Sie ein Array erhalten möchten (wie Titel schon sagt), verwenden toArray() Methode:

return Role::with('permissions')->get()->toArray(); 

Es wird die Sammlung in ein Array umwandeln.

Wenn Sie benutzerdefinierte müssen JSON erhalten formatiert (wie Ihr Beispiel zeigt), verwenden toArray(), dann dieses Array wieder aufzubauen mit der Verwendung von foreach oder array_map()/array_filter() Methoden und kodieren Ergebnis in JSON mit json_encode().

Ich würde Ihnen empfehlen, Daten so zu senden, wie es ist (ohne seine Struktur neu zu erstellen), an Frontend oder was auch immer und arbeiten damit dort.

+0

Aber ... 1) das gewünschte Ausgabeformat ist JSON, und 2) das wird immer noch nicht ändern die Berechtigungen Array wie das OP will. –

+0

Ich war verwirrt nach Titel der Frage (die Array sagt). Ich habe die Antwort aktualisiert. –

+0

Ja, tut mir leid für den Titel. Also muss ich das Array nach der Abfrage neu erstellen? Ist es möglich, es innerhalb der Beziehungsmethode zu tun? –

0

Ich bestelle eine Sammlung von Erlaubnis IDs extrahieren Sie die pluck() Funktion verwenden können:

$permissionIds = $role->permissions->pluck('permission_id'); 

Sie können auch eine Getter-Funktion in Ihrem Role Modell schreiben:

public function getPermissionIds() 
{ 
    return $this->permissions->pluck('permission_id'); 
} 

und Verwendung es mag:

$permissionIds = $role->getPermissionIds(); 

Sie können sogar die magische __get() Funktion außer Kraft setzen:

public function __get($attr) 
{ 
    if ($attr === 'permissionIds') { 
     return $this->getPermissionIds(); 
    } else { 
     return parent::__get($attr); 
    } 
} 

und die IDs Berechtigung wie ein Attribut zuzugreifen:

$permissionIds = $role->permissionIds; 
0

In Laravel 5.2 der Rückgabewert von Modellen ist eine Sammlung Instanz des verwendet werden, um das Ergebnis zu transformieren

$roles = Role::with('permissions')->get(); 
$roles->transform(function($role){ 
    $role['permissions'] = $role['permissions']->pluck('permission_id')->toArray(); 
    return $role; 
}); 

return $roles; 

Dieser Code wird die gewünschte liefern Ergebnis.

Hinweis: Sie können die Transformationsfunktion sogar nach der get-Funktion verketten.

0

ich diese Antwort hoffen, Ihnen helfen,

$role = Role::all(); 

    foreach ($role as $index){ 
     $permissions= $index->permissions; 
     foreach ($permissions as $permission){ 
      $permissionId[] = $permission->permission_id; 
     } 
     unset($index->permissions); 

     $index['all_permissions']= $permissionId; 
    } 

    return response()->json($role, 200);  

Dies ist für mich zu arbeiten.Also schau auf deinen Code.