2016-05-17 6 views
0

はここ権限、役割のための私のテーブル構造で、かつLaravel 5.1 ACLの役割と権限は、

許可permission_role:

ID 名

役割:

ID 名

permission_role:

role_id、 permission_id

ここで、permission_roleはピボットテーブルです。私はこのような設定に何かを持っている私のフロントエンドで

私controller.phpで

<form method="POST" action="/give/permission"> 
    {!! csrf_field() !!} 

     <select name="role" class="selectpicker" multiple data-max-options="2"> 
     @foreach($roles as $r) 
     <option value="{{$r->id}}">{{$r->name}}</option> 
     @endforeach 
</select> 
<div class="checkbox"> 
@foreach ($perm as $p) 
    {!! Form::checkbox('p[]', $p->id, in_array($p->id, $all_data)) !!} 
    {!! Form::label('permisssion', $p->name) !!}<br> 
@endforeach 
    </div> 
    <button type="submit" class="default">Submit</button> 
    </form> 

public function postrolperm(Request $request,$id){ 
    $p = Role::find($id); 
    $role = $request->role; 
    //dd($input1); 
    $permission = $request->p; 
    //dd($input2); 
    // 
    //$role = Role::where("name", "admin")->get(); 

    if(isset($permission) && isset($role)){ 
    $role->givePermissionTo($permission); 
    $role->save(); 
    } 
    return redirect::back(); 
} 

role.php welcome.blade.php

public function givePermissionTo(Permission $permission) 
    { 
     return $this->permissions()->save($permission); 
    } 

私は午前中ですピボットテーブルにデータを保存できません。

私は、次のコマンドを使用してphp artisan tinkerで試してみました:私は私のコントローラで間違ってやっている

$role = Role::first(); //which gives me the first role with id of 1 

    $role->givePermissionTo(Permission::first()); // it will save the first permission to the role. 

何?

また、このルートは正常に動作することに注意してください。

Route::get("/pivot", function(){ 
    $permission = new Permission; 
    $permission->name = "can to"; 
    $permission->save(); 
    $role = new Role; 
    $role->name = "admin2"; 
    $role->save(); 
    $role->givePermissionTo($permission); 
    return "true"; 

}); 
+0

ダイ・ダンプを実行します。役割と権限がリクエストから設定されていることを確認するために、コントローラ関数内の 'if'の中に' dd(私は設定されています) 'があります。 –

+0

はい..ダイのダンプの後に許可と許可が設定されています。 –

+0

'$ role-> givePermissionTo($ permission);'の後に '$ role-> save();'を呼び出します。それは動作しますか? –

答えて

1

idに基づいてRolePermissionオブジェクトを作成していないため、その理由が機能していないのが原因です。作業例を以下に示します:

$role_id = $request->role; 
$permission_ids = $request->p; // This comes back as an array. 
if(isset($permission_ids) && isset($role_id)){ 
    $role_object = Role::where('id', $role_id)->firstOrFail(); 
    foreach ($permission_ids as $permission_id) { 
     // loop through each permission id 
     // find the corresponding permission object in the database 
     $permission_object = Permission::where('id', $permission_id)->firstOrFail(); 

     // assign the object to the role 
     $role_object->givePermissionTo($permission_object); 
    } 
    $role_object->save(); 
} 
return Redirect::back() 

バックビューから渡された役割と権限は、データベース内の有効なIDに対応しない場合、これは例外をスローすることに注意してください。エラーが黙っている、つまり例外がスローされないようにするには、firstOrFail()の代わりにfirst()を使用します。

コントローラーファイルの先頭にuse App\Role;と​​を必ず追加してください。

ビューから渡されたロールIDを表す文字列にgivePermissionTo関数を呼び出そうとしています。$roleです。あなたは、データベースからRoleオブジェクトを取得する間のステップを逃した。

奇妙なことに、$p変数を使用していたことは間違いありませんでしたが、私の例に示すように、対応する$permissionオブジェクトもデータベースから取得する必要がありました。

+0

しかし、今私は単一の役割の複数の権限を選択すると、 "[App \ Permission]モデルのクエリ結果がありません"のようなエラーが表示されます。 if文でprint_r($ permission_id)とis_array($ permission)を実行しようとしました。しかし、内部のデータベースを挿入できませんでした。 –

+0

私は問題を見る、私は私のコンピュータに戻ったときにこれを修正します。 –

+0

更新されました。これで問題が解決した場合はお知らせください。 @Coold –

1

あなたはcontroller.phpファイルに

use App\Role; 

を追加しましたか?

+0

既にファイルに追加されています。 –

+0

postrolperm関数にパラメータ "Request $ request"を渡し、 "Use Illuminate \ Http \ Request;"を追加します。同じコントローラファイルに保存します。 –

関連する問題