首页 > 解决方案 > 当数据透视表具有唯一字段时更新 Laravel 数据透视表

问题描述

我有两个模型,用户和服务,具有多对多关系。数据透视表有两个附加字段,id_codealias。User 和 Service 之间可能有很多关系,但每一个都由 field 唯一标识id_code。我需要通过 检索数据透视表中的特定记录id_code,并仅更新该alias记录的 。

我的模型:

用户:

class User extends Authenticatable
{
    //All attributes & other functions here...

    public function linked_services(){
        return $this->belongsToMany(Service::class)
                        ->withPivot('alias', 'id_code')
                        ->withTimestamps();
    }
}

服务:

class Service extends Model
{
    //All attributes & other functions here...

    public function linked_users(){
        return $this->belongsToMany(User::class)
                       ->withPivot('alias', 'id_code')
                       ->withTimestamps();
    }
}

服务-用户迁移:

Schema::create('service_user', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id')->nullable();
        $table->unsignedBigInteger('service_id');
        $table->string('alias', 50)->nullable();
        $table->string('id_code', 50);

        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('service_id')->references('id')->on('services');

        $table->timestamps();
    });

在更新函数中,我从视图中获取了特定的 $id_code,但我不知道如何更新该特定“id_code”的“别名”。

我已经尝试过但不起作用的方法:

public function update(Request $request, String $id_code){

    foreach(Auth::user()->linked_services as $service){
        if($service->pivot->id_code === $id_code){
            $service->pivot->alias = $request->alias;
            $service->pivot->save();
        }
    }    
    return redirect()->route('services_user.index');
}

此函数更新 service_user 的所有现有数据透视记录,我只需要更新给定“id_code”的特定记录。

标签: laravelpivot-table

解决方案


我解决了!!!我告诉你怎么做:

Auth::user()->linked_services()
               ->wherePivot('id_code', $id_code)
               ->update(['alias' => $request->alias]); 

我了解到$user->linked_services()(与 不同$user->linked_services)返回一个关系对象(在本例中为belongsToMany),其中包含所有关系数据(中间表、枢轴、FK、父/相关对象等),并且可以在该对象上使用->wherePivot().


推荐阅读