2017-02-21 142 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 

注意,您可以通过使用方法的蛇情况名称作为主模型的属性来访问集合。