2017-06-09 19 views
1

laravelブレードの結果:(他の列が含まれていない)へのアクセス階層型の関係は、私はこれらの構造を持つテーブルを持っている

am_user:

のuser_id - 主キー

ユーザ名

パスワード

am_projects:

PROJECT_ID - 主キー

PROJECT_NAME

am_user_project:

をPROJECT_ID

のuser_idマイユーザーモデルがありTHI sの関係:

class User extends Authenticatable 
{ 

    protected $table = 'am_user'; 
    protected $primaryKey = 'user_id'; 
    public function userproject() 
      { 
       return $this->hasMany('App\UserProject', 'user_id', 'user_id'); 
      } 
} 

マイUserProjectは、この関係を持っています

class UserProject extends Model 
{ 
    protected $table = 'am_user_project'; 
    protected $primaryKey = null; 

    public function user() 
    { 
     return $this->belongsTo('App\User', 'user_id', 'user_id'); 
    } 

    public function project() 
    { 
     return $this->hasMany('App\Project', 'project_id', 'project_id'); 
    } 
} 

マイプロジェクトは、この関係を持っています

class Project extends Model 
{ 
    protected $table = 'am_project'; 
    protected $primaryKey = 'project_id'; 

    public function userproject() 
    { 
     return $this->belongsTo('App\UserProject', 'project_id'); 
    } 

} 

私がリストアップしたいのですがすべてのproject_names pe

public function index() { 
     $user = User::with(['userproject.project'])->find(Auth::id()); 
     return view('projects', compact('user')); 

    } 

をし、そのように刃でこれを投稿:

<div class="list-group"> 
       @foreach($user->userproject as $userproject) 
        @foreach($userproject->project as $project) 
        <a href="#" class="list-group-item"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> {{ $project->project_name }}</span></a> 
        @endforeach 
       @endforeach 
    </div> 

実際にこのような複数のforeachを回避する方法はあります私はこのことから得ることができ、認証されたユーザーに割り当てられたR・プロジェクト?

答えて

1

多対多のリレーションシップを修正する必要があります。

UserProjectモデルを削除します。

変更Userモデル:

class User extends Authenticatable 
{ 

    protected $table = 'am_user'; 
    protected $primaryKey = 'user_id'; 

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

変更プロジェクトモデル:

class Project extends Model 
{ 
    protected $table = 'am_project'; 
    protected $primaryKey = 'project_id'; 

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

今、あなたはこのようなユーザーを取得することができます

public function index() 
{ 
     $user = User::find(Auth::id()); 
     return view('projects', compact('user')); 
} 

をそして、このようにそれを示しています。

<div class="list-group"> 
     @foreach($user->projects as $project) 
      <a href="#" class="list-group-item"><span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> {{ $project->project_name }}</span></a> 
     @endforeach 
</div> 

続きを読むhere

+0

あなたは、App \ UserProjectのリレーションを削除し、ユーザーとプロジェクトの両方のモデルからApp \ UserProjectを指すすべてのリレーションを削除するとしますか? – Odinovsky

+0

私はApp \ UserProjectモデルを取り除くことを意味します。それは必要ではありません。多対多の関係では、このテーブルのモデルではなく、 'am_user_project'テーブルだけが必要です。 – piscator

+0

ありがとう!!これはうまくいきます...私は両方のモデルにディメンションテーブルの名前を指定して、App \ User内のprojects()リレーションに適切なフィールド名を追加するだけでした – Odinovsky

1

あなたが探しているのは、多岐にわたる関係です。以下のドキュメントを参照してください。https://laravel.com/docs/5.4/eloquent-relationships#has-many-through

+0

「am_user_project」の列を考慮すると、多対多の関係では十分ではありませんか? – piscator

+0

うんうんうまく電話そのテーブルの両方の外部キーに気付かなかった。別のオプションは、必要に応じてpivot()を使用することです。 – btl

関連する問題