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