从一个 table 到另一个 table 中的同一字段的多个外键 Laravel
Multiple foreign keys from one table to same field in another table in Laravel
我正在 Laravel 做一个项目,我有两个 table。
- "teams" (table) 和 "Team"(型号)
- "players" (table) 和 "Player"(型号)
用户可以选择 12 名球员的任意组合来组成他们自己的球队,所以我正在尝试创建 "one to many" 关系,其中球员对每个球员只有一个记录,但许多球队可以有相同的球员。
"players" table 将列 "id" 作为主键。
"teams" table 有 12 列,如 "player1_id"、"player2_id"、"player3_id" 等,每一列都将作为 "id" 的外键在玩家中 table.
我的明确问题是 - 我需要在两个模型(玩家和团队)中放入什么代码,以便我可以通过 Eloquent 访问信息。
到目前为止,我已将此代码放入我的团队 table,但不确定这样做是否正确。
对于玩家table,我不知道在那里写什么。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Team extends Model
{
//
public function player1()
{
return $this->belongsTo('App\Player', 'player1_id');
}
public function player2()
{
return $this->belongsTo('App\Player', 'player2_id');
}
public function player3()
{
return $this->belongsTo('App\Player', 'player3_id');
}
public function player4()
{
return $this->belongsTo('App\Player', 'player4_id');
}
public function player5()
{
return $this->belongsTo('App\Player', 'player5_id');
}
public function player6()
{
return $this->belongsTo('App\Player', 'player6_id');
}
public function player7()
{
return $this->belongsTo('App\Player', 'player7_id');
}
public function player8()
{
return $this->belongsTo('App\Player', 'player8_id');
}
public function player9()
{
return $this->belongsTo('App\Player', 'player9_id');
}
public function player10()
{
return $this->belongsTo('App\Player', 'player10_id');
}
public function player11()
{
return $this->belongsTo('App\Player', 'player11_id');
}
public function bonus_player()
{
return $this->belongsTo('App\Player', 'bonus_player_id');
}
}
有几种方法可以做到:
1- 您可以将团队球员放在单独的 table 中,比方说 team_players,包含列、team_id、player_id 和位置。在您的代码中验证始终有 12 位玩家在场。这将是一个多对多的关系。
在这种情况下,您可以在您的团队模型中使用此代码:
public function players() {
return $this->belongsToMany(Player::class, 'team_players');
}
不过,处理代码中的逻辑对于 laravel 初学者来说可能有点麻烦。
2-您可以简单地根据顺序进行查询:
public function player(int $position){
$playerId = $this->attributes('player'.$position.'_id');
return Player::find($player);
}
3- 你可以定义魔术方法,尽管我强烈反对你这样做。
public function __call(string $name , array $arguments){
if (Str::beginsWith($name, 'player')){
return $this->belongsTo(Player::class, $name.'_id');
}
}
可能还有其他方法,但我怀疑它们会有点混乱。
我正在 Laravel 做一个项目,我有两个 table。 - "teams" (table) 和 "Team"(型号) - "players" (table) 和 "Player"(型号) 用户可以选择 12 名球员的任意组合来组成他们自己的球队,所以我正在尝试创建 "one to many" 关系,其中球员对每个球员只有一个记录,但许多球队可以有相同的球员。 "players" table 将列 "id" 作为主键。 "teams" table 有 12 列,如 "player1_id"、"player2_id"、"player3_id" 等,每一列都将作为 "id" 的外键在玩家中 table.
我的明确问题是 - 我需要在两个模型(玩家和团队)中放入什么代码,以便我可以通过 Eloquent 访问信息。
到目前为止,我已将此代码放入我的团队 table,但不确定这样做是否正确。 对于玩家table,我不知道在那里写什么。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Team extends Model
{
//
public function player1()
{
return $this->belongsTo('App\Player', 'player1_id');
}
public function player2()
{
return $this->belongsTo('App\Player', 'player2_id');
}
public function player3()
{
return $this->belongsTo('App\Player', 'player3_id');
}
public function player4()
{
return $this->belongsTo('App\Player', 'player4_id');
}
public function player5()
{
return $this->belongsTo('App\Player', 'player5_id');
}
public function player6()
{
return $this->belongsTo('App\Player', 'player6_id');
}
public function player7()
{
return $this->belongsTo('App\Player', 'player7_id');
}
public function player8()
{
return $this->belongsTo('App\Player', 'player8_id');
}
public function player9()
{
return $this->belongsTo('App\Player', 'player9_id');
}
public function player10()
{
return $this->belongsTo('App\Player', 'player10_id');
}
public function player11()
{
return $this->belongsTo('App\Player', 'player11_id');
}
public function bonus_player()
{
return $this->belongsTo('App\Player', 'bonus_player_id');
}
}
有几种方法可以做到:
1- 您可以将团队球员放在单独的 table 中,比方说 team_players,包含列、team_id、player_id 和位置。在您的代码中验证始终有 12 位玩家在场。这将是一个多对多的关系。
在这种情况下,您可以在您的团队模型中使用此代码:
public function players() {
return $this->belongsToMany(Player::class, 'team_players');
}
不过,处理代码中的逻辑对于 laravel 初学者来说可能有点麻烦。
2-您可以简单地根据顺序进行查询:
public function player(int $position){
$playerId = $this->attributes('player'.$position.'_id');
return Player::find($player);
}
3- 你可以定义魔术方法,尽管我强烈反对你这样做。
public function __call(string $name , array $arguments){
if (Str::beginsWith($name, 'player')){
return $this->belongsTo(Player::class, $name.'_id');
}
}
可能还有其他方法,但我怀疑它们会有点混乱。