gpt4 book ai didi

php - Laravel Eloquent 关系 - 表的多列引用相同的外键

转载 作者:行者123 更新时间:2023-12-05 09:33:48 25 4
gpt4 key购买 nike

这里是 Laravel/Eloquent 新手。我正在实现一个简单的棋盘游戏。每场比赛有4名球员。表结构由 Players 表和 Games 表组成:

SELECT * FROM players;

id | name |
---------------------
1 | John |
2 | Mary |
3 | Linda |
4 | Alex |
5 | Chris |
6 | Ron |
7 | Dave |
SELECT * FROM games;

id | player1_id | player2_id | player3_id player4_id
---------------------------------------------------------------------
1 | 1 | 2 | 3 | 4
2 | 3 | 5 | 6 | 7
3 | 2 | 3 | 5 | 6
4 | 2 | 4 | 5 | 7

目标:希望能够得到一个玩家参加过的所有游戏。

为此,我尝试在 Player 模型中编写函数 games()。对于 id 2 的玩家,这应该返回游戏 1、3、4/对于 id 3 的玩家,它应该返回游戏 1、2、3 等等。

使用原始 SQL 我会做这样的事情:

SELECT * FROM games WHERE 
(player1_id = 2 OR player2_id = 2 OR player3_id = 2 OR player4_id = 2)

但是对于 Eloquent,我很难弄清楚必须如何建立这种关系才能实现这一目标。

同样,我也希望能够做相反的事情 - 返回游戏的所有玩家 - 在 Game 模型中使用函数 players()

模型:

// Models/Player.php

//...

class Player extends Model
{
public function games(){

//?

}
}
// Models/Game.php

//...

class Game extends Model
{
public function players(){

//?

}
}

最佳答案

在不更改数据库结构的情况下,您可以滥用 hasMany 声明来获取所有 4 个玩家。

class Game extends Model
{
public function players()
{
return $this->hasMany(Player::class, 'id', 'player1_id')
->orWhere('id', $this->player2_id)
->orWhere('id', $this->player3_id)
->orWhere('id', $this->player4_id);
}
}
class Player extends Model
{
public function games()
{
return $this->hasMany(Game::class, 'player1_id', 'id')
->orWhere('player2_id', $this->id)
->orWhere('player3_id', $this->id)
->orWhere('player4_id', $this->id);
}
}

但这并不理想。

您应该有第三个表来正确映射这种多对多关系。

table 1 - players:     id (pk), name
table 2 - games: id (pk)
table 3 - game_player: id (pk), game_id (fk), player_id (fk), unique([game_id, player_id])
class Game extends Model
{
public function players()
{
return $this->belongsToMany(Player::class, 'game_player');
}
}
class Player extends Model
{
public function games()
{
return $this->belongsToMany(Game::class, 'game_player');
}
}

关于php - Laravel Eloquent 关系 - 表的多列引用相同的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67027576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com