2017-02-21 7 views
0

を介して2つのテーブルからデータを取得:Laravel雄弁は、私は、次の3つのテーブルを持っている中間テーブル

users 
    id - integer 
    name - string 

tracker_sessions 
    id - integer 
    user_id - integer 
    geoip_id - integer 

tracker_geoip 
    id - integer 
    country - string 

をこれらは私のモデルです:

class User extends Authenticatable 
{ 
    public function tracker_geoip(){ 
     return $this->hasManyThrough('App\TrackerGeo', 'App\TrackerSession', 'geoip_id', 'id', 'id'); 
    } 
    public function tracker_sessions(){ 
     return $this->hasMany('App\TrackerSession'); 
    } 
} 

class TrackerGeo extends Model 
{ 
    protected $table = 'tracker_geoip'; 
} 

class TrackerSession extends Model 
{ 
    protected $table = 'tracker_sessions'; 
} 

それは雄弁を使用して、この結果を得ることは可能ですか? :

0 => [ 
    'name' => 'John Smith', 
    'geoip' => ['id' => 12, 'country' => 'Greenland'] 
] 

私はこれを試してみた:

$usersWithGeo = App\User::with('tracker_geoip')->get()->toArray(); 

これは、ユーザ情報の配列を返していますが、tracker_geoipサブアレイは、テーブル内のレコードがある場合でも、常に空です。

+0

なぜ* tracker_sessions *のモデルが必要ですか? Laravelは自動的に多対多の関係を処理します。 – TheFallen

+0

@Fallenは実際にはピボットテーブルを使用していません。だから彼はモデル ' – xhulio

+0

'を' load() 'メソッドを使って試してみる必要があります。すなわちApp \ User :: load( 'tracker_geoip'); ' –

答えて

0

テーブルの構造を見ると、tracker_geoipの関係は、実際にはbelongsToManyではなく、hasManyThroughでなければなりません。

return $this->belongsToMany('App\TrackerGeo', 'tracker_sessions', 'user_id', 'geoip_id')->distinct(); 

これが役に立ちます。

+0

ありがとうございます!あなたの提案はうまくいきましたが、現在、 'tracker_geoip'サブアレイには重複したインデックスがたくさんあります。ユーザーのセッション数と同じ数の索引があります。私は、 'tracker_geoip' => ['id' => 12、 'country' => 'Greenland']のように、単一のインデックスしか取得できない場合があります。サブクエリでフィルタリングできますか? – user3102290

+0

その場合、関係に 'distinct()'を追加するだけです。私はこれを示すために私の答えを更新しました。 –

+0

それは完璧に働いた、大変ありがとう。 – user3102290

0

は(関係を避けて)次のコードを試してみてください。

class TrackerSession extends Model 
{ 
    public function getGeoipNameAttribute(){ 
     return TrackerGeo::where('id', $this->attributes['geoip_id'])->first(); //you can stop here or add ->country; to get only the country name 
    }; 
} 

上記の方法は、特定のIDのTrackerGeoコレクションの国の名前を取得します。

ここで必要なのは、特定のユーザーのすべてのトラッカーセッションを取得することです。だから、私たちが持っているユーザーのモデルに:

public function getTrackerSessionAttribute(){ 
    return TrackerSession::where('user_id', %this->attributes['id'])->get() //or first() depends on the number of records you want to retrieve. 
} 

とあなたのビューに次の操作を行うことができます

$user->tracker_session->geoip_name // ->country depends on the return result 

あなただけの1 first()雄弁方法を持つレコード、または

@foreach($user->tracker_session as $session) 
    {{$session->geoip_name}} // {{$session->geoip_name->country}} depends on the return result 
@endforeach 
を取得した場合

メインモデルの属性としてメソッドのスネークケース名を使用してコレクションにアクセスできることに注意してください。

関連する問題