2017-02-21 49 views
0

得到兩個表的數據,我有以下三個表:Laravel雄辯通過中間表

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

@TheFallen實際上他沒有使用數據透視表。所以他需要模型 – 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'=>'格陵蘭島]]。可能是過濾子查詢? – 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 
    }; 
} 

以上方法檢索TrackerGeo收集指定id的國名。

現在您需要的是獲取給定用戶的所有跟蹤器會話。因此,在用戶模型,我們有:

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 

注意,您可以通過使用方法的蛇情況名稱作爲主模型的屬性來訪問集合。