Laravel中从一个表到另一个表中的同一字段的多个外键

Posted

技术标签:

【中文标题】Laravel中从一个表到另一个表中的同一字段的多个外键【英文标题】:Multiple foreign keys from one table to same field in another table in Laravel 【发布时间】:2020-03-22 16:16:11 【问题描述】:

我正在 Laravel 的一个项目中工作,我有两张桌子。 - “团队”(表)和“团队”(模型) - “玩家”(表)和“玩家”(模型) 用户可以选择 12 名球员的任意组合来组建自己的球队,所以我试图创建“一对多”的关系,其中每个球员只有一个记录,但许多球队可以有相同的球员。 “玩家”表将“id”列作为主键。 “teams”表有“player1_id”、“player2_id”、“player3_id”等12列,每一列都作为players表中“id”的外键。

我的明确问题是 - 我需要在两个模型(玩家和团队)中放入什么代码,以便我可以通过 Eloquent 访问信息。

到目前为止,我已将此代码放在我的团队表中,但不确定这是否是正确的做法。 对于玩家表,我不知道该写什么。

<?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】:

有几种方法可以做到:

1- 您可以将团队球员放在一个单独的表中,比如 team_players,包含列、team_id、player_id 和 position。在您的代码中验证始终存在 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');
  

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

【讨论】:

我认为,我认为,OP 过于复杂了一点。 Imo,OP应该坚持第一种方法。 TeamPlayers 之间的多对多。 Team 属于 UserPlayers 属于 Team。可以有一列标记active 状态以维护历史记录。正如您所说,在插入之前或在必要时,OP 可以检查属于特定UserTeam 拥有的玩家的活动数量。 @rajendersohi 是的,您的代码没问题,应该可以工作,但是有很多重复项 我按照方法号中的建议创建了另一个表。 1. 感谢所有试图提供帮助的人。

以上是关于Laravel中从一个表到另一个表中的同一字段的多个外键的主要内容,如果未能解决你的问题,请参考以下文章

在SQL数据库中如何把一个表的同一个字段复制到同一个表的另一个字段?

mysql 设置外键,能否将表中多个字段关联到另一个表中的同一字段

SQL语句把同一个表中的a字段中的数据复制到另一个字段b中

SQL语句把同一个表中的a字段中的数据复制到另一个字段b中

在同一活动工作簿中从一个工作表复制和粘贴到另一个工作表时出现错误 1004

如何在 Laravel 中从外键中查看表字段