1

我有以下三个表:

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

4

2 回答 2

0

查看您的表结构,关系tracker_geoip实际上应该是 abelongsToMany而不是 a hasManyThrough

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

希望这可以帮助!

于 2017-02-21T09:30:03.413 回答
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

如果您使用first()Eloquent 方法仅检索了 1 条记录,或者

@foreach($user->tracker_session as $session)
    {{$session->geoip_name}} // {{$session->geoip_name->country}} depends on the return result
@endforeach

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

于 2017-02-21T09:40:51.290 回答