Соотношение между 3 таблицами в Laravel 5.7 - PullRequest
0 голосов
/ 21 января 2019

У меня есть три стола:

PLAYERS with a team_id

TEAMS

SCORES with a player_id 

Дело в том:

В моих командах есть игроки, у которых есть очки, и я хотел бы составить рейтинг команд.Таким образом, в основном набирайте лучший результат по игрокам и суммируйте его, если в команде несколько игроков.

Например:

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

}

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Попробуйте этот простой способ

Сначала выберите всех игроков определенной команды, например

$players=PLAYERS::where('team_id',1)->get();//1 is a sample value pass your team_id

Затем используйте foreach для итерации каждого идентификатора игрока и получения наибольшего количества очков

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]);

Надеюсь, это поможет:)

0 голосов
/ 23 января 2019

Если у кого-то возникла такая же проблема, я нашел решение:

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;  
}
0 голосов
/ 21 января 2019

Сначала вы должны были определить функцию hasMany для модели Player, указывающую на модель Score. Затем вы можете запросить лучший результат Player, выполнив $player->scores()->max('value') (при условии, что $value является атрибутом, который содержит фактическое значение оценки в модели Score).

Получив это, вы можете использовать этот фрагмент для определения аксессора , чтобы вы могли сделать что-то вроде $player->bestScore для получения максимального балла за игрока.

Затем, имея способ запросить лучший результат Игрока, вы должны были определить отношение HasMany на модели Team, указывающее на модель Player. Запрос для получения результата команды будет выглядеть как $team->players->sum('max_score'). Вы также можете определить мутатор для этого атрибута, чтобы иметь доступ к этому фрагменту, как $team->score.

Наконец, для заказа всех команд это будет:

  return Team::all()->sortByDesc('score');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...