两个模型之间的关系与中间表

Posted

技术标签:

【中文标题】两个模型之间的关系与中间表【英文标题】:Relation between two models with intermediate table 【发布时间】:2019-11-13 02:50:28 【问题描述】:

花费数小时尝试和失败,阅读文档并尝试将文档翻译成我在 Laravel 中面临的挑战。

最糟糕的是,我不认为这个问题很难解决,但不知怎的,我的大脑无法正常工作。

我正在使用的 Laravel 应用是环法自行车赛的梦幻经理。我有RiderStage 模型,还有一个中间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 多对多关系检查与中间表

与多个中间表的多对多 Laravel Eloquent 关系

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

TP5的多对多模型,以及中间表,已经中间表的增删改查

TP5的多对多模型,以及中间表,已经中间表的增删改查

建表原则