Laravel Eloquent 足球比赛日程中的多重关系

Laravel Eloquent multiple relationship in a football game schedule

我是 Laravel 和 Eloquent 的新手,我正在尝试制定足球比赛计划。
现在我有 4 tables(有一些示例条目):

团队(所有团队)

+---------+-----------+
| team_id | team_name |
+---------+-----------+
|       1 | Arsenal   |
|       2 | Chelsea   |
+---------+-----------+

比赛(所有比赛)

+----------------+------------------+
| competition_id | competition_name |
+----------------+------------------+
|              1 | Premier League   |
+----------------+------------------+

schedule(比赛日程)

+----+----------------+----------+--------------+--------------+-----------+-----------+
| id | competition_id | matchday | home_team_id | away_team_id | home_goal | away_goal |
+----+----------------+----------+--------------+--------------+-----------+-----------+
|  1 |              1 |        1 |            1 |            2 |         3 |         2 |
|  2 |              1 |        2 |            2 |            1 |         0 |         3 |
+----+----------------+----------+--------------+--------------+-----------+-----------+

schedule_teams(在 competition_id 和 schedule_team_id 上将日程表 teamid 与团队 id 匹配)

+----+------------------+----------------+----------+
| id | schedule_team_id | competition_id | teams_id |
+----+------------------+----------------+----------+
|  1 |                1 |              1 |        1 |
|  2 |                2 |              1 |        2 |
+----+------------------+----------------+----------+

这是我目前的 类:

Schedule.php

public function competition()
{
   return $this->belongsTo(Competition::class, 'competition_id', 'competition_id');
}

Competition.php

public function schedule()
{
   return $this->hasMany(Schedule::class, 'competition_id', 'competition_id');
}

$id = \request('competition_id');
$schedule = Schedule::where('competition_id', $id)->with('competition')->get();

我从日程表中获取了带有家庭和离开 ID 的日程表。 现在的问题是,我怎样才能从 schedule_teams table 的团队 table 获得指定的主场和客场 ID,例如 home_team_id = 1:
home_team_id (=1) -> schedule_team_id (=1) 和 competition_id (=1) -> 球队(阿森纳)

我希望 collection 中的时间表和相关团队的数据输出到 blade。

有人可以帮助我改进足球数据库吗?

你应该利用 hasManyThrough 关系。

如果你创建说 Schedule\Team,然后像下面这样。

public function schedule() {
    $this->belongsTo(Schedule::class, 'schedule_id');
}

public function team() {
    $this->belongsTo(Team::class, 'team_id');
}

现在在您的 Schedule class 中,您可以拥有以下内容。

public function teams() {
    $this->hasManyThrough(Team::class, Schedule\Team::class, 'schedule_id');
}

还应注意,您的日程安排团队中不需要 competition_id。既然球队属于赛程,赛程属于赛程,那么就可以拿来了。

如果您还希望 Team 知道它的日程安排,您可以将其添加到 Team

public function schedules() {
    return $this->hasManyThrough(Schedule::class, Schedule\Team::class);
}

Schedule\Team class 本质上是一个枢轴 table 的美化表示,但将其作为模型,可以让你在未来扩展它。它还有助于保持一切整洁。

希望这是有道理的。