Php 拉威尔-关系问题
我有3种型号:Php 拉威尔-关系问题,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有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 M
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');
}
}
因此有:
- 站点和用户之间的多对多关系
- 用户和统计数据之间的多对多关系
- 站点和统计数据之间的一对多关系
//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请求,页面速度较慢
您有更好的解决方案吗?如果站点有许多用户,并且站点有许多统计信息,那么用户通过站点有许多统计信息 修改
用户
类:
public function stats() {
return $this->hasManyThrough('App\Stat', 'App\Site', 'user_id', 'site_id');
}
急负荷:
$user = User::with('stats')->find($user_id);
$stats = $user->stats();
另外,我认为你们的统计数据应该
属于站点,因为站点有很多统计数据。你们需要改变很多属于的统计数据,因为它们看起来使用不正确。若站点有很多用户,并且站点有很多统计数据,那个么一个用户通过站点有很多统计数据
修改用户
类:
public function stats() {
return $this->hasManyThrough('App\Stat', 'App\Site', 'user_id', 'site_id');
}
急负荷:
$user = User::with('stats')->find($user_id);
$stats = $user->stats();
另外,我认为你的统计数据应该属于
站点,因为站点有很多
统计数据。你需要改变很多属于
的属性,因为它们看起来使用不正确。这不是在视图中使用的最佳解决方案。聚合可能是你想要的,因此,计算是在DB端完成的:@Yurich我完全同意^^我完全同意这正是我所用的不?这对分析瓶颈非常有帮助。这不是在视图中使用Where的最佳解决方案。聚合可能是您在这里想要的,因此数学是在数据库端完成的:@Yurich我完全同意^ihatehandles这正是我使用的没有?这对分析瓶颈非常有帮助。但是用户也有很多网站,所以很多网站都不起作用。我把我的问题编辑成精确的关系。尽管如此,你的hasOne是对的,我用一个belongTo代替了它。但是用户也有很多网站,所以hasManyThrough不起作用。我把我的问题编辑成精确的关系。尽管如此,你对错误的hasOne是正确的,我用belongTo替换了它。