laravel:更新或创建(更新插入)数据透视表

Posted

技术标签:

【中文标题】laravel:更新或创建(更新插入)数据透视表【英文标题】:laravel: update or create (upsert) for pivot table 【发布时间】:2021-04-03 13:34:43 【问题描述】:

有没有一种 Laravel(即简单的)方法可以在数据透视表上执行 upsert?

我正在使用以下代码:

        if ($mpi->sites()->where('site_id', $site_id)->exists())
        
            $mpi->sites()->updateExistingPivot($site_id, ['pivot_data'=>$pivot_data]);
        
        else 
        
            $mpi->sites()->attach($site_id, ['pivot_data'=>$pivot_data]);
        

我想要的是这样的:

$mpi->sites()->updateOrAttach($site_id, ['pivot_data'=>$pivot_data]);

我的 Mpi 模型如下所示:

class Mpi extends Model


    public function sites()
    
        return $this->belongsToMany("App\Site")->withPivot('site_mrn');
    

    .....

【问题讨论】:

猜你应该看看sync()laravel.com/docs/8.x/…$mpi->sites()->sync($site_id, ['pivot_data'=>$pivot_data]); 所以,sync() 的问题是它会删除其他相关记录。另一种选择是syncWithoutDetaching(),如果相关记录已经存在,则会引发错误。 【参考方案1】:

您可以使用newPivotQuery 女巫为数据透视表创建一个新的查询生成器

$mpi->sites()->newPivotQuery()
          ->updateOrInsert(['mpi_id'=>$mpi->id,'site_id'=>$site->id]
          ,['mpi_id'=>$mpi->id,'site_id'=>$site->id,'pivot_data'=>$pivot_data]);

【讨论】:

以上是关于laravel:更新或创建(更新插入)数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 数据透视表批量插入多个字段

在数据透视表 laravel 中删除行和插入行

Laravel插入或更新数组,多行

Laravel 复选框问题,我无法更新数据透视表

Laravel 5.4 如何更新数据透视表?

如何在 laravel 5 中使用 Eloquent 更新数据透视表