Laravel雄辩地通过中间表从两个表中获取数据

Laravel雄辩地通过中间表从两个表中获取数据,laravel,laravel-eloquent,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

我有以下三个表格:

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子数组始终为空,即使表中有记录

查看您的表结构,
tracker\u geoip
的关系实际上应该是
belongstomy
而不是
hasManyThrough

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

希望这有帮助

查看您的表结构,
tracker\u geoip
的关系实际上应该是
belongstomy
而不是
hasManyThrough

return $this->belongsToMany('App\TrackerGeo', 'tracker_sessions', 'user_id', 'geoip_id')->distinct();
希望这有帮助

尝试以下代码(避免关系):

上述方法检索具有给定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
请注意,您可以使用方法的snake-case名称作为主模型的属性来访问集合。

尝试以下代码(避免关系):

上述方法检索具有给定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

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

为什么需要跟踪程序会话的模型?Laravel将自动为您处理多对多关系。@实际上,他并没有使用透视表。因此,他需要模型。您是否也尝试过使用
load()
方法。i、 e
App\User::load('tracker_geoip')为什么您需要跟踪程序会话的模型?Laravel将自动为您处理多对多关系。@实际上,他并没有使用透视表。因此,他需要模型。您是否也尝试过使用
load()
方法。i、 e
App\User::load('tracker_geoip')谢谢!您的建议确实有效,但现在“tracker\u geoip”子数组有许多重复的索引。它的索引数与用户会话数相同。有没有可能我只能得到一个索引,像这样:“tracker_geoip”=>['id'=>12,'country'=>'Greenland']。是否可以使用子查询进行筛选?在这种情况下,您只需要将
distinct()
添加到您的关系中。我已经更新了我的答案来显示这一点。谢谢!您的建议确实有效,但现在“tracker\u geoip”子数组有许多重复的索引。它的索引数与用户会话数相同。有没有可能我只能得到一个索引,像这样:“tracker_geoip”=>['id'=>12,'country'=>'Greenland']。是否可以使用子查询进行筛选?在这种情况下,您只需要将
distinct()
添加到您的关系中。我已经更新了我的答案来说明这一点。