我有两个模型:
的球员,游戏
现在每个游戏都有两个关系,homePlayer: BelongsTo(Player) &awayPlayer: BelongsTo(球员)。这意味着在我的数据库中,游戏看起来是这样的:
游戏:
- id
- home_player_id
- away_player_id 得分
- …
现在在玩家的个人资料中,我有一个显示他所有游戏的表格。我希望现在能够根据对手进行排序,这样与相同对手进行的比赛就会被"分组"。
我现在的问题是,对手有时是主队,有时是客队。这意味着我不能简单地按away_player排序,我必须按对手的id排序,有时可能是home_player_id,有时可能是away_player_id。
有什么建议告诉我如何解决这个问题吗?
class Game extends Model {
protected $with = ['homePlayer', 'awayPlayer'];
public function homePlayer(){
return $this->belongsTo(Player::class, 'home_player_id');
}
public function awayPlayer(){
return $this->belongsTo(Player::class, 'away_player_id');
}
}
可以在eloquent中传递闭包给groupBy
。所以你可以在这里添加你的条件。
首先在模型中添加条件:
public function filter(Player $player)
{
if ($this->homePlayer->id === $player->id) {
return $this->awayPlayer;
}
if ($this->awayPlayer->id === $player->id) {
return $this->homePlayer;
}
}
然后使用条件来获得组结果:
$games->groupBy(function ($game) use ($player) {
return $game->filter($player)->id;
});