我正在尝试根据拥有用户的点数来获取排名表。
我的用户模型是(简化):
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()
。
任何人都可以帮助我吗?提前谢谢。
答案 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;
}