2017-04-24 7 views
0

私はLaravelで三重関係をモデル化する方法について苦労しています。ユーザー、ツアーや写真Eloquent triple relation

各ツアー、それに関連付けられたユーザーと、すべてのユーザーが写真を投稿することができました。

私は3つのモデルを持っています。どのデータベースがこのようなものになります意味:

ID、tour_id、USER_IDは、

私が知っているこの方法をphoto_idどのユーザー投稿された写真のツアーのために。私の質問は、私はEloquentでこれをどのようにモデル化するのですか?

答えて

1

更新あなたの最後のコメントに基づいています。

あなたの質問に対する最も簡単な答えは、関係belongsToManyhasManyを使用することです。

私を説明しましょう。 4人のユーザー、ツアー、tour_user、写真が必要です。IDが含まれているテーブル

ユーザー、名前

ツアーテーブル含まID、名前、

tour_userテーブルには、ID、tour_idを含ん

写真のテーブルはID、名前、USER_IDを含んUSER_ID、

をtour_id

なぜbelongsToMany?各ユーザーに複数のツアーがあり、各ツアーには複数のユーザーがいるためです。そこで、3つ目のテーブルtour_userを使用して両方のテーブルをリンクします。それは正規化にも役立ちます。

今、私たちは関係のためのテーブル構造を検討していること、のは、Userモデルでそれを定義してみましょう:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class User extends Model 
{ 

    public function tours() 
    { 
     return $this->belongsToMany('App\Tour'); 
    } 
    /* To retrieve photos of a user */ 
    public function photos() 
    { 
     return $this->hasMany('App\Photo'); 
    } 

} 

ツアーモデル:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Tour extends Model 
{ 

    public function users() 
    { 
     return $this->belongsToMany('App\User'); 
    } 
    /* To retrieve photos of a tour*/ 
    public function photos() 
    { 
     return $this->hasMany('App\Photo'); 
    } 

} 

今写真モデル:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Photo extends Model 
{ 

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

} 

を使用して、特定のユーザーのすべてのツアーを検索しましょう
public function show($id) 
{ 
    $user = User::find($id); 
    return view('show')->withUser($user) ; 
} 

今すぐショービューで、ページはすべて、そのユーザのツアーや彼の写真

@foreach($user->tours as $tour) 
    {{ $tour->name }} 
    @foreach($tour->photos as $photo) 
     @if($user->id == $photo->user_id) 
     {{ $photo->name }} 
     @endif 
    @endforeach 
@endforeach 
+0

特定のツアーを行った特定のユーザーの写真を検索する必要があります。私はこれが私の問題を解決する方法を見ていません – kjanko

+0

foreach($ user-> photos as $ photo){$ photo-> name;} –

+0

@kjankoあなたの要件に基づいて答えによって完全に更新します。それがあなたのために働くことを願ってください。 –

0

あなたは持っている必要があります。多くのツアー>ユーザーと多くのユーザーへ 1に1>の写真

は、あなたのツアーモデルでこの機能が含まれます。

public function allusers() 
    { 
     return $this->hasMany(User::class); 
    } 

これはあなたのユーザーモデルです。

public function allphotos() 
    { 
     return $this->hasMany(Photos::class); 
    } 

次に、あなたがツアーに$tour = Tour::find(1);

を取得することができますし、ちょうどこのを持つユーザーを取得するための関数を使用します。

$usersOnTour = $tour->allusers(); 
0

まず、あなたのtour modeluser_id foriegnキーフィールドを持っていることを確認してくださいと 'photo_id'のforiegnキーフィールドはuser moelです。

トリックはuser modelとhasOne/hasManyの関係がphoto modelであり、次にとのhasOne/hasMany関係を持つtour modelがあります。

1 - あなたは

のようなツアーモデルをフェッチするときに、この

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

ようhasManyの関係を定義し、あなたのtour modelで - 最初にごuser modelこの

public function photo() 
{ 
    return $this->hasOne('App\Photo'); 
} 

2のような関係を定義します

$a = tour::All(); できます $a->users->'field_in_user_table' or $a->users->photo; // to get the photo field value from photo table

+0

を抽出することができますこれは与えられたツアーに写真を返すが、それに属しているユーザーのすべての写真はありません特定のツアー。ユーザーは多くのツアーに参加することができます。 – kjanko

+0

@ちゃんこああ、私は質問の画像をどこのユーザーのプロフィール画像と思った。 –

関連する問題