Laravel - 关系问题

时间:2016-02-14 13:28:09

标签: 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 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');
    }
}

所以有:

  • 网站和用户之间的多对多关系
  • 用户与统计数据之间的多对多关系
  • 网站与统计信息之间的一对多关系

网站包含统计信息列表,用户可以从此列表中获得一些统计信息。

enter image description here

我正在尝试获取所有网站和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请求,并且页面速度较慢。

您有更好的解决方案吗?

1 个答案:

答案 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,因为它们看起来使用不正确。