两个模型之间的关系与中间表
Posted
技术标签:
【中文标题】两个模型之间的关系与中间表【英文标题】:Relation between two models with intermediate table 【发布时间】:2019-11-13 02:50:28 【问题描述】:花费数小时尝试和失败,阅读文档并尝试将文档翻译成我在 Laravel 中面临的挑战。
最糟糕的是,我不认为这个问题很难解决,但不知怎的,我的大脑无法正常工作。
我正在使用的 Laravel 应用是环法自行车赛的梦幻经理。我有Rider
和Stage
模型,还有一个中间RiderStageStatus
模型,我将在其中存储有关骑手是否加入舞台的信息。我也想实现阶段结果,所以我想这个问题稍后会再次出现。
但是,我的数据库是这样的:
riders
- id
- name
- ...
stages
- id
- departure
- arrival
- ...
statuses
- id
- name
- ...
rider_stage_statuses
- id
- rider_id
- stage_id
- status_id
所以我应该能够获得某个阶段的车手及其状态Stage::find(1)->riders
,并且还可以获得车手每个阶段的状态Rider::find(1)->stages
。
但我无法在模型中建立正确的关系。我做错了什么?
【问题讨论】:
rider_stage_statuses
看起来像三元关系的数据透视表。 Laravel 不支持这些,所以拥有RiderStageStatus
可能是不可避免的。我认为,在您的特定情况下,三元组并不是绝对必要的,但如果您仍然想沿着这条路走下去,请为额外的挑战做好准备
@apokryfos 有趣的是,从长远来看,我宁愿做最聪明的事情。如果我应该避免三元关系,我应该如何开始?
我个人怀疑地看着status
表。这实际上取决于您的数据模型是什么,但我希望状态与骑手直接相关,而不是骑手/阶段,假设我已经正确理解了状态。
@apokryfos 我明白了。问题是骑手可能会因为受伤而退出一个阶段。但他将参加下一阶段。因此,我需要为每个骑手的每个阶段添加一个状态。
【参考方案1】:
解决方案 1
The documentation 表明你可以添加一个额外的参数来告诉 Laravel 使用哪个表作为数据透视表。
如下构建你的类:
类骑手
class Rider
public function stages()
return $this->belongsToMany(Stage::class, 'rider_stage_statuses');
课堂阶段
class Stage
public function riders()
return $this->belongsToMany(Rider::class, 'rider_stage_statuses');
解决方案 2
我们还可以通过修复 intermediate table 来修复您的代码。
谁应该像这样构造你的代码:
类骑手
class Rider
public function stages()
return $this->belongsToMany(Stage::class)->using(RiderStageStatus::class);
课堂阶段
class Stage
public function riders()
return $this->belongsToMany(Rider::class)->using(RiderStageStatus::class);
【讨论】:
以上是关于两个模型之间的关系与中间表的主要内容,如果未能解决你的问题,请参考以下文章
与多个中间表的多对多 Laravel Eloquent 关系