在数据透视表 laravel 中添加与附加值的关系

Posted

技术标签:

【中文标题】在数据透视表 laravel 中添加与附加值的关系【英文标题】:add relationship to added values in pivot table laravel 【发布时间】:2020-03-23 13:32:43 【问题描述】:

我是 laravel 关系的新手,但我熟悉 SQL。我正在尝试添加一个具有其他值的数据透视表,而不仅仅是两个主要 id。

我有一些用户和一些团队。每个用户可以演奏多种乐器,并且可以在多个团队中,但每个团队只能演奏一种乐器。

我的支点迁移:

Schema::create('team_members', function (Blueprint $table) 

  $table->integer('user_id')->unsigned();
  $table->integer('team_id')->unsigned();
  $table->integer('instrument_id')->unsigned();

  $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
  $table->foreign('team_id')->references('id')->on('teams')->onDelete('cascade');
  $table->foreign('instrument_id')->references('id')->on('user_instruments')->onDelete('cascade');
);

我已经看到了:

$team = Team::first();
$team->members->first()->details->instrument_id; // "2"

如何定义user_instruments上的instrument_id之间的关系,这样我就可以做到$team->members->first()->details->instrument

更新: 我找到了这个:https://medium.com/@DarkGhostHunter/laravel-has-many-through-pivot-elegantly-958dd096db

不确定它是否会起作用......

【问题讨论】:

【参考方案1】:

您应该创建一个intermediate model TeamMember,您将在其中定义与 Instrument 的关系。为此,请修改团队和用户的多对多关系,添加“使用”选项,如下所示:

// Team.php

public function members() 
  return $this->belongsToMany(App\User::class, 'team_members', 'user_id')
    ->using(App\TeamMember:class);

然后您需要为您的数据透视表创建一个名为 TeamMember 的模型,它将扩展 Pivot 类并定义与 Instrument 的关系。

class TeamMember extends Pivot 
  public function instrument() 
    return $this->belongsTo(App\Instrument::class);
  

那么您应该能够像这样获得仪器(假设您为数据透视表设置了自定义名称为“详细信息”):$team->members->first()->details->instrument

【讨论】:

谢谢!这个对我有用! return $this->belongsToMany('\App\Team', 'team_members')->as('details')->withPivot('instrument_id')->using('App\TeamMember');

以上是关于在数据透视表 laravel 中添加与附加值的关系的主要内容,如果未能解决你的问题,请参考以下文章

laravel4 更新数据透视表中的附加列

Laravel Eloquent - 附加与 SyncWithoutDetaching

laravel 多对多关系不存储在数据透视表中

数据透视表的laravel关系问题

Laravel 5 - 从数据透视表额外属性获取属性

在 Laravel 4 中查询数据透视表