2016-03-09 81 views
3

我試圖根據有多少點的用戶來獲取排名表。Laravel得到一個關係列排序的模型集合

我的用戶模型(簡體):

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

而點模型是:

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

基於@ 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'); 
} 

然後我創建了一個函數t O調用排名:

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

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

    return $users; 
} 
0

嘗試

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

,並使用它像

 $data = User::with('points')->get(); 
+0

嗨@ nextt1,當我把這個代碼Laravel說:「調用一個成員函數的OrderBy()的字符串」。嚴...... –

+0

試試這個新的代碼。 – nextt1

+0

謝謝@ nextt1這是一個很好的起點,知道我會爲了得到我想要的排名而玩(命令DESC和需要的列。 –