Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉威尔-关系问题_Php_Laravel_Laravel 5 - Fatal编程技术网

Php 拉威尔-关系问题

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

我有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请求,页面速度较慢


您有更好的解决方案吗?

如果站点有许多用户,并且站点有许多统计信息,那么用户通过站点有许多统计信息

修改
用户
类:

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替换了它。