Laravel中的四(或五)表关系

时间:2019-04-29 19:38:34

标签: php mysql laravel relationship

我曾尝试阅读Laravel文档和其他类似的有关Laravel数据库关系的文章,但是我似乎无法全神贯注于它以及它如何适用于我的用例。

我经营一个高中运动的网站。我有5张桌子:

  1. 学校-该州所有学校的独立列表。
  2. 体育-国家批准的所有体育活动的独立列表。
  3. 季节-独立的季节列表(每学年一个季节)。
  4. 联赛-联赛/会议的独立列表。
  5. league_divisions-具有多个分区(例如“大十大东部”和“大十大西部”)的联赛的分区列表,其中联赛=父级,联赛_子级=子级。注意:一个联赛只有在有分区的情况下才会在此表中有子记录;大多数高中运动会/联赛没有部门,因此该表中没有相应的记录。

学校经常每时每刻改变联赛,或者改变他们所属联赛的哪个部门。 (以为“ school_leagues”)

类似地,学校可能开始进行一项新运动(A学校过去从未有过女足球,但现在有一支足球队)或停办了旧运动(B学校不再有足球队)。 (请考虑“ school_sports”)

此外,尽管该州可能批准25项体育运动,但联盟本身只能批准10项。我的网站是针对联盟本身的,所以我还需要一种方法列出联盟体育运动的哪些制裁。 (请考虑“ league_sports”)

在我以前的(拉拉韦尔之前的)数据模型中,我只是有一个“ school_leagues”表,用于存储学校在特定季节范围内的联赛(和分部,如果适用)(通过start_season_id,end_season_id)。另外,在HTML中,我只是简单地将静态列表硬编码为一个联盟认可的运动项目,以及哪些球队应该出现在该运动项目的排名中。

但是,当我重建数据模型时,我想我可能需要一个更复杂的关系表,该表将学校,体育,季节,联赛和(可选)联赛分区合并在一起。

另外,不是使用start_season_id和end_season_id(如果该关系仍然有效,则end_season_id为NULL),Laravel公约是否会强迫我在每个运动/联赛/赛季的每项运动中每所学校获得1条记录? (这将直接加入season_id,而不是具有start / end_season_id列)

感谢您的帮助!

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

或者我将有1个主表连接到school_id,sport_id,season_id,League_id和(可选)League_division_id。每个实例会有1条记录,因此每年我都会生成一组新记录。

1 个答案:

答案 0 :(得分:0)

Laravel / Eloquent为多对多关系提供了可服务的方案。 https://laravel.com/docs/5.8/eloquent-relationships#many-to-many在您的应用中,您具有几个多对多的关系,例如# Unrestricted model model_u = lm(logwage ~ educ + abil + exper + motheduc + fatheduc + broken + sib, data = koop2004) # Restricted model model_r = lm(Prc ~ LndSz, data = RealEstate) # F-Test require(data.table) linearHypothesis(model_u, c( "HseSz = 0", "Bdrms = 0")) 。 Eloquent使用联接表(称为schools >----< sports之类的形式在DBMS中表示该联接表。

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

例如

  • 斯图弗森特高中(学校)有一个
  • 精密步枪(运动)团队
  • 在2018年春季(赛季)参加
  • 纽约极客运动联盟(联赛)
  • 他们赢了10场,输了3场比赛,队长是Deadeye Robinson(属性)

2019年春季团队需要这些实体中的另一个实体。

一张桌子可能看起来像这样:

captain

我会进行除法运算,但是我不了解其结构。

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

诀窍是为应用程序世界中的每个真实事物确定一个实体,然后确定实体之间的关系。 (这需要练习才能做到。)