从一个 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');
  }
}

可能还有其他方法,但我怀疑它们会有点混乱。