Laravel获得由关系列排序的模型集合

时间:2016-03-09 08:00:37

标签: php eloquent laravel-5.1

我正在尝试根据拥有用户的点数来获取排名表。

我的用户模型是(简化):

namespace Gamify;
class User extends Model
{
    protected $table = 'users';

    public function points()
    {
        return $this->hasMany('Gamify\Point');
     }

     public function scopeMember($query)
     {
         return $query->where('role', '=', 'default');
     }
 }

Point模型是:

namespace Gamify;
class Point extends Model
{
    protected $table = 'points';

    protected $fillable = array(
        'points',
        'description'
    );

    public function user()
    {
        return $this->belongsTo('Gamify\User');
    }
}

我想获得一个用户集合,其总和包括这个总和。

像这样(此代码只是一个模型):

public static function getRanking($limitTopUsers = 10)
{
    return User::member()->orderBy(sum('points'))->get();
}

我一直在玩User::with()和范围而我正在尝试不使用DB::raw()

任何人都可以帮助我吗?提前谢谢。

2 个答案:

答案 0 :(得分:0)

尝试

public function points ()
    {
        return $this->hasMany('Gamify\Point')
            ->selectRaw('sum(points) as sum, user_id')
            ->groupBy('user_id');
    }

并像

一样使用它
        $data = User::with('points')->get();

答案 1 :(得分:0)

基于@ nextt1的代码,这是我的最终方法:

在用户模型上:

public function points()
{
    return $this->hasMany('Gamify\Point')
        ->selectRaw('sum(points) as sum, user_id')
        ->groupBy('user_id');
}

public function getExperiencePoints()
{
    return $this->points()->sum('points');
}

然后我创建了一个函数来调用排名:

public static function getRanking($limitTopUsers = 10)
{
    $users = User::Member()->with('points')->get();

    $users = $users->sortByDesc(function ($user) {
        return $user->getExperiencePoints();
    })->take($limitTopUsers);

    return $users;
}