我有3个型号:
class Site extends Model
{
public function users()
{
return $this->belongsToMany('App\Models\User');
}
public function stats()
{
return $this->hasMany('App\Models\Stat');
}
}
class User extends Model
{
public function sites()
{
return $this->belongsToMany('App\Models\Site');
}
public function stats()
{
return $this->belongsToMany('App\Models\Stat');
}
}
class Stat extends Model
{
public function users()
{
return $this->belongsToMany('App\Models\User');
}
public function sites()
{
return $this->belongsTo('App\Models\Site');
}
}
所以有:
网站包含统计信息列表,用户可以从此列表中获得一些统计信息。
我正在尝试获取所有网站和foreach网站,连接用户的统计数据。
我试过的那一刻:
//repository
function getAll($user_id = 0)
{
$with = [];
$with['users'] = function ($query) use ($user_id) {
$query->where('id', '=', $user_id);
};
return Site::with($with)->orderBy('name')->get();
}
//controller
$sites = getAll($user_id);
//view
foreach($sites as $site){
$count_stats = $site->users->first()->stats->where('site_id',$site->id)->count();
}
它可以工作,但它不是很优雅,它会执行很多sql请求,并且页面速度较慢。
您有更好的解决方案吗?
答案 0 :(得分:0)
如果网站有很多用户,并且网站有很多统计信息,那么用户有很多网站统计信息
修改User
类:
public function stats() {
return $this->hasManyThrough('App\Stat', 'App\Site', 'user_id', 'site_id');
}
急切加载:
$user = User::with('stats')->find($user_id);
$stats = $user->stats();
此外,我认为您的统计信息应该belongsTo
网站,因为网站hasMany
统计信息。您需要更改大量belongsToMany
,因为它们看起来使用不正确。