【问题标题】:In Laravel many-to-many relationship, is there a way to update data in a pivot table?在 Laravel 多对多关系中,有没有办法更新数据透视表中的数据?
【发布时间】:2021-02-13 00:16:27
【问题描述】:

我建立了两个模型用户和机构。 添加其他数据透视列后,如何更新它们之间的数据透视数据?

<?php

class User extends Authenticatable
{
    public function institutions()
    {
        $pivots = ['id', 'program_choice', 'session'];
        return $this->belongsToMany('App\Institution')
            ->withPivot($pivots);
    }
}


class Institution extends Authenticatable
{

    public function users()
    {
        $pivots = ['id', 'program_choice', 'session'];
        return $this->belongsToMany('App\User', 'institution_user')
            ->withPivot($pivots);;
    }
}

这里是迁移

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->integer('user_id')->unsigned();
            $table->rememberToken();
            $table->timestamps();
        });
    }

class CreateInstitutionsTable extends Migration
{
    public function up()
    {
        Schema::create('institutions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->unique();
            $table->string('city')->nullable();
            $table->string('state')->nullable();
            $table->string('country')->nullable();
            $table->string('address')->nullable();
            $table->string('user_id')->nullable();
            $table->string('postal_code')->nullable();
            $table->timestamps();
        });
    }
}

这就是数据透视表的样子

我可以将信息附加到数据透视表

public function storeInstitution(Request $request)
    {
        $user_id = auth()->user()->id;
        $user = User::find($user_id);
        $institution_id = $request->input('institution_id');
        $user_program_choice = $request->input('program_choice');
        $user_session = $request->input('session');
        $user_inst =   array(
            'program_choice' => $user_program_choice,
            'session'        => $user_session,
            'user_id'        => $user_id,
            'institution_id' => $institution_id
        );
        $user->institutions()->attach($institution_id, $user_inst);
        return 'success';
    }

但无法更新附加的枢轴例如,我无法将 program_choice,particle physics 更改为 digital art
这是我当前的代码

 public function updateInstitutions(Request $request, $pivot_id)#TODO id is pivot_id
    { 
        $user_id = auth()->user()->id;
        $user = User::find($user_id);
        $institution_id = $request->input('institution_id');
        $pivot_attributes =   array(
            'user_id'        => $user_id,
            'institution_id' => $institution_id,
            'session'        => $request->input('session'),
            'program_choice' => $request->input('program_choice'),
        );

        $user->institutions()->updateExistingPivots($institution_id, $pivot_attributes, false);
        return 'success';

    }

如何使用数据透视 ID 更新数据透视数据?

【问题讨论】:

    标签: laravel eloquent many-to-many


    【解决方案1】:

    检查the documentation关于这方面。

    更新数据透视表上的记录

    如果您需要更新数据透视表中的现有行,您可以使用 updateExistingPivot 方法。此方法接受数据透视记录 外键和要更新的属性数组:

    $user = App\Models\User::find(1);
    
    $user->roles()->updateExistingPivot($roleId, $attributes);
    

    【讨论】:

    • 枢轴有一个主键。有没有办法使用主键而不是外键来更新?
    • @jay4592 您可以创建一个数据透视模型,然后直接从那里查询该行。见laravel.com/docs/8.x/…
    • 是否有广泛涵盖 Pivot 模型的书籍、视频或文章?它是否与普通模型具有相同的行为?我可以为它创建控制器吗?我可以使用 save() 方法吗?
    • @jay4592 Pivot 类扩展了 Model 一个(参见 this),所以是的.. 相同的行为。
    • 谢谢。这就是我需要知道的。让人放心。
    猜你喜欢
    • 2020-05-01
    • 2016-03-29
    • 1970-01-01
    • 2023-02-05
    • 2018-09-23
    • 2020-07-03
    • 1970-01-01
    • 2019-10-19
    • 2015-02-11
    相关资源
    最近更新 更多