Laravel Eloquent通过中间表

时间:2017-02-21 08:55:16

标签: laravel laravel-eloquent

我有以下三个表:

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子数组也始终为空。

2 个答案:

答案 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

请注意,您可以使用方法的蛇案例名称作为主模型的属性来访问集合。