2017-12-27 42 views
2

私は、下のコードのように、子と親の関係にあるUserモデルとRoleモデルを持っています。私は親を通して子にアクセスできますが、その逆はできません。子供の役割($ user-> role)にアクセスすると、私にIDだけが与えられます。ロールカラムにはロールテーブルに外部キーがありますが、その反対は機能しません。 は基本的には、 $の役割は役割がない一方で、ユーザーの役割、Eloquentモデルの関係は機能しません。クエリでもありません

Laravel-Debugbarは、さらに、ユーザは余分なクエリを実行しないことを示しているだけで彼のIDが表示されないすべてのユーザー する$ user->役割が含まれています。

ユーザーテーブル

id name email password remember_token client role created_at updated_at

役割テーブル

id name display_name description created_at updated_at

ユーザーモデル

namespace App; 
use Illuminate\Notifications\Notifiable; 
use Illuminate\Foundation\Auth\User as Authenticatable; 
use Illuminate\Database\Eloquent\Model; 
use Laratrust\Traits\LaratrustUserTrait; 
use App\Client; 
use App\Role; 
use App\Permission; 

class User extends Authenticatable 
{ 
    use LaratrustUserTrait; 
    use Notifiable; 

    protected $fillable = [ 
     'name', 'email', 'password','role', 
    ]; 
    public function client(){ 
     return $this->hasOne('App\Client', 'client'); 
    } 
    public function role(){ 
     return $this->belongsTo('App\Role')->withDefault(); 
    } 
} 

ロールモデル

namespace App; 

use Laratrust\Models\LaratrustRole; 
use App\Permission; 
use App\User; 

class Role extends LaratrustRole 
{ 
      protected $fillable = [ 
     'name', 'display_name', 'description', 
    ]; 
     public function GetHasPermission($perm){ 
      return DB::table('permission_role')->where('role', $this->id) 
        ->where('permission',$perm)->first()->value('type'); 
     } 
     public function users(){ 
      return $this->hasMany('App\User','role', 'id'); 
     } 
     public function permissions(){ 
      return $this->hasMany('App\Permission'); 
     } 
     public function getName(){ 
      return $this->name; 
     } 
} 

編集:私はLaratrustを使用していることに注意してください。

答えて

3

Laravel naming conventionsをフォローしていないので、手動で外部キーを定義する必要があります。その後->roleの代わりに->role()->first()を使用

public function role() 
{ 
    return $this->belongsTo('App\Role', 'role')->withDefault(); 
} 

https://laravel.com/docs/5.5/eloquent-relationships#one-to-many-inverse

:だから、にrole()関係を変更します。 ->role()は関係を直接使用します。 ->roleは、オブジェクトのプロパティを最初に使用しようとしており、存在しない場合は、関連するデータ(オブジェクトまたはコレクション)をロードします。 Userオブジェクトにはroleプロパティがあるため、Laravelは関連するRoleオブジェクトを読み込む代わりにLaravelを使用します。

+1

正確に。 Laravelはロールの代わりにrole_idを探しています –

+0

すでに試しました。それが正しいと思われても動作しません。 –

+0

@ Statharas.903私はコードが正しいと確信しています。助けが必要な場合は、このコードでどのようなエラーが発生しているか教えてください。 –

関連する問題