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

Posted

技术标签:

【中文标题】Laravel 5 - 从数据透视表额外属性获取属性【英文标题】:Laravel 5 - Get property from Pivot Table extra attribute 【发布时间】:2018-08-18 00:42:11 【问题描述】:

零件和材料模型之间存在多对多关系。它与数据透视表完美配合。

现在我刚刚在数据透视表中添加了另一列,名为“provider_id”。我需要的是当用户将材料添加到零件时,他还为该材料选择了哪个提供者(因为材料提供者也是多对多关系),所以当我这样做时:

@foreach($parts as $key => $value)
 @foreach($value->materials as $mkey => $mvalue)
   $mvalue->provider_id 
 @endforeach
@endforeach

我得到了提供商 ID,没关系。但我想得到它的名字。类似 $mvalue->provider->name 的东西。我该怎么做?

这是我的数据透视表迁移

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

    $table->integer('part_id')->unsigned();
    $table->foreign('part_id')->references('id')
        ->on('parts')->onDelete('cascade');

    $table->integer('material_id')->unsigned();
    $table->foreign('material_id')->references('id')
        ->on('materials')->onDelete('cascade');

    $table->integer('provider_id')->unsigned();
    $table->foreign('provider_id')->references('id')
        ->on('providers')->onDelete('cascade');

    $table->timestamps();
  );

零件模型:

class Part extends Model

  public function materiales()
   return $this->belongsToMany('App\Material', 'material_part')->withPivot('part_id', 'provider_id');
  

我在Material模型中也有同样的关系。

提供者模型:

public function materials()
  return $this->belongsToMany('App\Material', 'material_provider');

每个关系都运行良好,但访问每个部分的每个材料的单个提供者。

谢谢!

编辑:

我正在尝试这个(还没有成功)

public function materials()
    return $this->belongsToMany('App\Material', 'material_part')
            ->withPivot('part_id', 'provider_id')
            ->join('providers', 'material_part.provider_id', '=', 'providers.id');

    //SELECT * FROM `material_parte` INNER JOIN providers ON material_part.provider_id = providers.id

【问题讨论】:

【参考方案1】:

我刚收到:

public function materiales()
  return $this->belongsToMany('App\Material', 'material_part')
            ->withPivot('part_id', 'provider_id')
            ->join('providers', 'material_part.provider_id', '=', 'providers.id')
            ->select('providers.name as pivot_providers_name', 'materials.*');

  //SELECT * FROM `material_part` INNER JOIN providers ON material_part.provider_id = providers.id

谢谢!

【讨论】:

【参考方案2】:

为了从pivot 表中获取值,您使用pivot->propertyName

@foreach($parts as $key => $value)
 @foreach($value->materials as  $mvalue)
    $mvalue->pivot-> provider_id 
 @endforeach
@endforeach

希望对你有帮助

【讨论】:

以上是关于Laravel 5 - 从数据透视表额外属性获取属性的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 中的数组向数据透视表中的额外列添加条件值

Laravel 数据透视表获取值并传递给刀片模板

Laravel,sync() - 如何同步数组并传递额外的数据透视字段?

使用 Laravel 数据透视表的多行和多列输入表单

隐藏数据透视表 Laravel 的一些嵌套属性

Laravel中数据透视表的访问关系