Laravel中的四(或五)表关系

问题描述 投票:2回答:1

我曾尝试阅读Laravel文档以及关于Laravel数据库关系的其他类似帖子,但我似乎无法理解它以及它如何适用于我的用例。

我为高中田径运行一个网站。我有5张桌子:

  1. 学校 - 该州所有学校的独立名单。
  2. 体育 - 国家批准的所有体育项目的独立名单。
  3. 四季 - 独立季节列表(每学年一个季节)。
  4. 联赛 - 联赛/会议的独立列表。
  5. league_divisions - 有多个分区的联赛分区列表(想想“Big Ten East”和“Big Ten West”),其中联赛= parent和league_divisions = child。注意:如果联盟有分区,联盟在这张表中只会有儿童记录;大多数高中体育会议/联赛没有分区,因此在此表中没有相应的记录。

学校经常会改变联赛,或者可能会改变他们所属联盟的哪个部门。 (想想“school_leagues”)

同样,一所学校可能会开始进行新的运动(学校A过去从未有过女子足球,但现在他们有一支球队)或者停止了一项旧运动(学校B不再有足球队)。 (想想“school_sports”)

此外,虽然国家可能会批准25项运动,但联盟本身可能只会制裁10.我的网站是针对联盟本身的,所以我还需要一种方法来列出联盟制裁的哪些运动。 (想想“league_sports”)

在我的旧(Laravel之前)数据模型中,我只有一个“school_leagues”表,存储了一个学校属于特定季节范围的联盟(以及分区,如果适用)(通过start_season_id,end_season_id)。此外,在HTML中,我简单地编写了一个静态列表,其中列出了一个由联盟批准的体育运动以及哪些球队应该出现在该运动的排名中。

然而,当我重建我的数据模型时,我想我可能需要一个更复杂的关系表,它加入了学校,体育,四季,联赛和(可选)联盟部门。

另外,不是使用start_season_id和end_season_id(如果关系仍然有效,则end_season_id为空),Laravel惯例是否会强迫我每个联赛/赛区每个赛季每个学校有1个记录? (这将直接加入season_id,而不是具有start / end_season_id列)

任何帮助表示赞赏!

我可以简单地使用3个关系表:school_leagues,school_sports和league_sports,所有人都可以通过season_id(每年1条记录)或start / end_season_id加入季节。

或者我将有一个主表加入school_id,sport_id,season_id,league_id和(可选)league_division_id。每个实例将有1条记录,因此每年我都会生成一组新的记录。

php mysql laravel relationship
1个回答
0
投票

Laravel / Eloquent为多对多关系提供了一个可用的方案。 https://laravel.com/docs/5.8/eloquent-relationships#many-to-many在你的应用程序中,你有几个多对多的关系,例如schools >----< sports。 Eloquent使用连接表(称为schools_sports,在DBMS中表示这一点)。

为了处理这里的复杂性,您可能需要在数据库设计中使用新实体。我们称之为teamseason。每个学校,体育,赛季和联赛都有其中一个。它涉及这些实体中的每一个,并且它可能具有诸如wonlostcaptain以及与团队和季节相关的其他数据点的属性。

例如,

  • Stuyvesant高中(学校)有一个
  • 精密气步枪(运动)团队
  • 2018年春季(赛季)参加比赛
  • 纽约市极客体育联盟(联赛)
  • 他们赢了10场并且输掉了3场比赛,队长是Deadeye Robinson(属性)

您将需要为2019年春季团队中的另一个实体。

它的表可能如下所示:

teamseason_id  PK
school_id      FK to school.school_id
sport_id       FK to sport.sport_id
season_id      FK to season.season_id
league_id      FK to league.league_id
won            int
lost           int
captain        varchar(128)

我投入分裂,但我不理解结构。

这看起来可能是某种四向连接表,但它不止于此。我添加了won / lost / captain属性来强调它是它自己的实体。

诀窍是为应用程序世界中的每个真实物体识别一个实体,然后识别实体之间的关系。 (这很好地练习。)

© www.soinside.com 2019 - 2024. All rights reserved.