2016-08-19 13 views
2

私はLaravel 5.2を使用していると私は変更Laravel関係の出力構造

Role.php

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

との役割や権限のモデルを持っていると私は

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

を呼び出す場合、それが返されます

[{ 
     "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 
     } 
}] 

"permissions"構造をこれらのように変更することは可能ですか?

[{ 
     "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

あなたの最善の策は、コレクションをマップし、アクセス権のプロパティを変更することです。 –

答えて

0

あなたは(タイトルが言うように)配列を取得したい場合は、toArray()メソッドを使用します。これは、配列にコレクションを変換します

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

を。

あなたがtoArray()を使用して、(あなたの例が示すように)カスタムフォーマットされたJSONを取得する必要がある場合は、json_encode()とJSONにforeachまたはarray_map()/array_filter()方法やエンコード結果を用いて、このアレイを再構築。

フロントエンドなどにデータを送信し(構造を再構築せずに)、そこで動作することをお勧めします。

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

あなたはまた、あなたのRoleモデルにgetter関数を記述することができます:

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

と使用私はあなたがpluck()機能を使用することができます許可IDのコレクションを抽出するため

+0

しかし... 1)望ましい出力形式はjsonであり、2)OPが望むようにパーミッション配列を変更することはありません。 –

+0

私は質問のタイトル(配列)に混乱しました。私は答えを更新しました。 –

+0

タイトルに申し訳ありません。だから、私はクエリの後に配列を再構築する必要がありますか?関係メソッドの中でそれを行うことは可能ですか? –

0

それは好きです:

$permissionIds = $role->getPermissionIds(); 

あなたもマジック__get()機能無効にすることができます:モデルの戻り値がどのできるコレクションインスタンスであるLaravel 5.2で

$permissionIds = $role->permissionIds; 
0

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

をし、属性などの許可IDをアクセス結果を変換するために使用される

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

return $roles; 

このコードは、望ましい結果。

注:変換関数をget関数の後に連結することもできます。私はこの答えはあなたに役立つことを願っています

0

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

これは私のための仕事です。だからあなたのコードを確認してください。