我有三个表:
PLAYERS with a team_id
TEAMS
SCORES with a player_id
问题是:
我的球队有得分得分的球员,我想对球队进行排名。因此,从根本上来说,要获得球员的最高分,并且如果一个团队有几个球员,就可以得出总分。
例如:
团队A具有玩家1和玩家2。 玩家1拥有3分(例如300、150和500),而我只想保留最好的分数(即500)。
您知道我该怎么做吗? 由于团队和得分之间或球员和得分之间没有直接关系,我不知道如何在这3个之间建立联系。
感谢您的帮助!
编辑
得分模型
class Score extends Model
{
protected $fillable = [
'value', 'player_id'
];
public function player()
{
return $this->belongsTo('App\Player');
}
public function players_scores()
{
return $this->hasManyThrough('App\Team', 'App\Player');
}
}
玩家模型
class Player extends Model
{
protected $fillable = [
'name','email','team_id'
];
/**
* Get the team of the player
*/
public function team()
{
return $this->belongsTo('App\Team');
}
/**
* Get the scores of the player
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function scores()
{
return $this->hasMany('App\Score');
}
/**
* Get the maximum score from the player
*
* @return mixed
*/
public function getBestScoreAttribute()
{
return $this->scores->max('value');
}
}
团队模型
class Team extends Model
{
protected $fillable = ['name','logo'];
protected $appends = ['score'];
public function players()
{
return $this->hasMany('App\Player');
}
/*
* Collect all the team players scores
*/
public function players_scores()
{
return $this->hasManyThrough('App\Score', 'App\Player');
}
public function scores()
{
return $this->hasMany('App\Score');
}
/*
* Sum the score of all team players to get the team score
*/
public function getScoreAttribute()
{
return $this->players_scores->sum('value');
}
}
答案 0 :(得分:0)
首先,您应该在hasMany
模型上定义一个指向Player
模型的Score
函数。然后,您可以通过执行Player
来查询$player->scores()->max('value')
的最佳得分(假设$value
是保存Score
模型中实际得分值的属性)。>
有了这些代码后,就可以使用该代码段定义an accessor,这样您就可以执行$player->bestScore
之类的操作来获得玩家的最高得分。
然后可以通过一种查询玩家最佳成绩的方式,在指向HasMany
模型的Team
模型上定义Player
关系。获取团队得分的查询类似于$team->players->sum('max_score')
。您还可以为此属性定义一个变量,以便您可以像$team->score
这样访问此代码段。
最后,要订购所有团队,将是:
return Team::all()->sortByDesc('score');
答案 1 :(得分:0)
尝试这种简单方式
首先选择特定团队的所有球员,例如
$players=PLAYERS::where('team_id',1)->get();//1 is a sample value pass your team_id
然后使用foreach迭代每个玩家ID并获得最高得分
foreach($players as $player)
{
$score=SCORES::where('player_id',$player)->orderBy('score', 'desc')->value('score'); // gets only the highest score of the player
$total=$total+$score;//Sum of the highest score
}
然后,如果要插入表格中,则表示
TEAMS::create(['team_id'=>1,'score'=>$total]);
希望有帮助:)
答案 2 :(得分:0)
如果有人遇到相同的问题,我找到了解决方法:
static function getDailyTeams(int $limit = 10)
{
$callback = function($query) {
$query->whereDate('scores.created_at', date('Y-m-d'));
};
$player = function($query) use ($callback) {
$query->whereHas('scores', $callback)->with(['scores' => $callback]);
};
$teams = Team::with(['players' => $player])->get()->sortByDesc(function ($team) {
return $team->players->sum('best_score');
}
);
return $teams;
}