Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩关系-表的多列引用同一外键_Php_Laravel_Eloquent_Eloquent Relationship - Fatal编程技术网

Php Laravel雄辩关系-表的多列引用同一外键

Php Laravel雄辩关系-表的多列引用同一外键,php,laravel,eloquent,eloquent-relationship,Php,Laravel,Eloquent,Eloquent Relationship,Laravel/这里有能言善辩的新手。我正在实现一个简单的棋盘游戏。每场比赛有4名球员。表结构包括一个玩家表和一个游戏表: SELECT * FROM players; id | name | --------------------- 1 | John | 2 | Mary | 3 | Linda | 4 | Alex | 5 | Chris | 6 | Ro

Laravel/这里有能言善辩的新手。我正在实现一个简单的棋盘游戏。每场比赛有4名球员。表结构包括一个玩家表和一个游戏表:

SELECT * FROM players;

id    | name        |
---------------------
1     | John        |
2     | Mary        |
3     | Linda       |
4     | Alex        |
5     | Chris       |
6     | Ron         |
7     | Dave        |
目标:我希望能够获得一名球员参加过的所有比赛

为此,我试图在播放器模型中编写一个函数
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)
但是有了雄辩,我很难弄明白一个人必须如何建立这种关系才能实现这一目标

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

模型:

// Models/Player.php

//...

class Player extends Model
{
    public function games(){

        //?

    }
}

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

类游戏扩展模型
{
公共职能扮演者()
{
return$this->hasMany(Player::class'id',player1\u id')
->或者在哪里('id',$this->player2\u id)
->或者在哪里('id',$this->player3\u id)
->或者在哪里('id',$this->player4\u id);
}
}
类播放器扩展模型
{
公益游戏
{
返回$this->hasMany(游戏::类,'player1\u id','id')
->orWhere('player2_id',$this->id)
->orWhere('player3_id',$this->id)
->或where('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])
类游戏扩展模型
{
公共职能扮演者()
{
返回$this->belongtomany(Player::class,'game_Player');
}
}
类播放器扩展模型
{
公益游戏
{
返回$this->belongtomany(游戏::类,“游戏玩家”);
}
}

在不改变数据库结构的情况下,您可以误用
一个
有许多
声明来获取所有4名玩家

类游戏扩展模型
{
公共职能扮演者()
{
return$this->hasMany(Player::class'id',player1\u id')
->或者在哪里('id',$this->player2\u id)
->或者在哪里('id',$this->player3\u id)
->或者在哪里('id',$this->player4\u id);
}
}
类播放器扩展模型
{
公益游戏
{
返回$this->hasMany(游戏::类,'player1\u id','id')
->orWhere('player2_id',$this->id)
->orWhere('player3_id',$this->id)
->或where('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])
类游戏扩展模型
{
公共职能扮演者()
{
返回$this->belongtomany(Player::class,'game_Player');
}
}
类播放器扩展模型
{
公益游戏
{
返回$this->belongtomany(游戏::类,“游戏玩家”);
}
}

这是一个N对N的关系,你必须规范化。
DB::table('games')->where('player1_-id','=',
id
)->where('player2_-id','=','id')->where('player3_-id','=','id')->或where('player4_-id','=','id')->get()@HassaanAli No!!!!!!使用关系,停止使用
DB::something
,认为对于简单的操作,
DB::something
不存在!!!!!!!!!我同意。这不是惯例。但为了简单起见,解决方案就在那里。:)这是一个N对N的关系,您必须规范化。
DB::table('games')->where('player1_id','=',
id
)->where('player2_id','=','id')->where('player3_id','=','id')->或where('player4_id','=','id')->get()@HassaanAli No!!!!!!使用关系,停止使用
DB::something
,认为对于简单的操作,
DB::something
不存在!!!!!!!!!我同意。这不是惯例。但为了简单起见,解决方案就在那里。:)这正是我想要的。诚然,更合适的解决方案(也是更好的设计)确实是使用pivot表规范化数据库。然而,为了简单起见,我很可能会选择这种方法。非常感谢。这正是我想要的。诚然,更合适的解决方案(也是更好的设计)确实是使用pivot表规范化数据库。然而,为了简单起见,我很可能会选择这种方法。非常感谢。
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])