我有以下三个表:
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';
}
是否可以使用Eloquent获得此结果? :
0 => [
'name' => 'John Smith',
'geoip' => ['id' => 12, 'country' => 'Greenland']
]
我试过这个:
$usersWithGeo = App\User::with('tracker_geoip')->get()->toArray();
这会返回一个用户信息数组,但即使表中有记录,tracker_geoip子数组也始终为空。
答案 0 :(得分:0)
查看您的表格结构,tracker_geoip
的关系实际上应该是belongsToMany
而不是hasManyThrough
。
return $this->belongsToMany('App\TrackerGeo', 'tracker_sessions', 'user_id', 'geoip_id')->distinct();
希望这有帮助!
答案 1 :(得分: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
如果您只使用first()
Eloquent方法检索了1条记录,或
@foreach($user->tracker_session as $session)
{{$session->geoip_name}} // {{$session->geoip_name->country}} depends on the return result
@endforeach
请注意,您可以使用方法的蛇案例名称作为主模型的属性来访问集合。