2017-09-04 16 views
1

私は遠い関係を掴みようとしていて、うまくいきません。 hasManyThroughを実行しようとしましたが、それはbelongsToManyの関係では動作していません。それはクエリエラーを投げていた。ここで遠くのbelongsToManyからbelongsToManyを取得

は私移行している。ここで

Schema::create('users', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->string('email')->unique(); 
     $table->string('password'); 
     $table->rememberToken(); 
     $table->timestamps(); 
    }); 

    Schema::create('roles', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->timestamps(); 
    }); 


    Schema::create('role_user', function (Blueprint $table) { 
     $table->integer('role_id'); 
     $table->integer('user_id'); 
    }); 

    Schema::create('permissions', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('group'); 
     $table->string('name'); 
     $table->timestamps(); 
    }); 

    Schema::create('permission_role', function (Blueprint $table) { 
     $table->integer('permission_id'); 
     $table->integer('role_id'); 
    }); 

は私のモデルです:

class User extends AuthUser 
{ 
    // 

    public function roles() 
    { 
     return $this->belongsToMany('App\Role'); 
    } 
} 

class Role extends Model 
{ 
    // 

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

私が何をしようとしている:

$user = App\User::find(1); 
Log::info($user->roles->permissions); 

これは私にProperty [permissions] does not exist on this collection instance.エラーになります。

どのようにしてユーザーのロールを使用してユーザーのアクセス許可を取得できますか?

編集:私はこれを改善するにはどうすればよい

if (auth()->check()) { 
    if (auth()->user()->roles->contains('name', 'Admin')) { 
     Gate::before(function() { 
      return true; 
     }); 
    } 
    else { 
     $permissions = []; 

     foreach (auth()->user()->roles as $role) { 
      $permissions = array_merge($permissions, $role->permissions->pluck('name')->all()); 
     } 

     foreach (array_unique($permissions) as $permission) { 
      Gate::define($permission, function() { 
       return true; 
      }); 
     } 
    } 
} 

私は私がやろうとしているものに、この醜い解決策を作ってみましたか?

+0

多人数の関係がユーザーとロールにありますか? –

+0

あなたの関係はどうですか? 1人のユーザーには多くの役割があり、その役割には多くの権限がありますか? –

+0

@ImmortalDudeありがとうございます。 – kjdion84

答えて

0

変更$ user = App \ USER-> find(1);

to this $ user = App \ User :: find(1);

あなたが移行 $卓上>外国(で外部キーを設定していない、これはあなた

+0

私の質問にはタイプミスがありました。それはすでに 'App \ User :: find(1)'でした。それは動作しません。 – kjdion84

0

のために動作しますしてみてください 'ROLE_ID) - >参照(' ID ') - (役割)上>';

同じユーザー

+1

外部キーは問題を解決しません。リレーションシップは外部キーが設定されていなくても動作します。私も外来キーを追加して試してみましたが、結果は同じでした。 – kjdion84

+0

変更が完了した後に職人が移行する – Abhishek

1

のために定義するあなたは熱心な負荷、このようなそれらの関係する必要があります

$user = User::with(['roles', 'roles.permissions'])->where('id', 1)->first(); 

は、これはあなたのロールの配列、およびそれぞれの権限を持つそれぞれの役割を与えます。上記のクエリで

Permission::whereHas('role', function($query) use ($user_id) { 
    return $query->whereHas('user_id', $user_id); 
}); 

アイデアは、あなたが遠い関係、you work backwardsの多くに多くをしたいときということです。

+0

OPを見ることができますか?私は何をしようとしているのかの編集にいくつかのコード例を示しました。私は基本的に今すぐコードをリファクタリングしようとしているので、それほど些細なことではありません。任意のヒント? – kjdion84

+0

あなたはそれの背後にある推論をも提供できますか?あなたの例はおそらくうまくいくが、なぜ彼の推論が失敗するのか、そして多対多から多対多の関係で集約が機能しない理由をOPに理解させる:P – Merv

0

ので、それはあなたにProperty [permissions] does not exist on this collection instance.エラーを与えた:あなたのモデルの役割でpermissionsは、単一のモデルである一方、$user->rolesは、役割のコレクションを返すあなたは$role->permissions

が、使用する前に、基本的にあなたがforeach($user->roles as $role)に持っている...

をここでは、役割に応じて許可を得るためにforeachの必要はありませんサンプルは..だ

auth()->user()->roles->where('name','=','Administrator')->permissions;

、それは管理者のアクセス許可の配列/コレクションを返すでしょう。

関連する問題