【问题标题】:laravel: update or create (upsert) for pivot tablelaravel:更新或创建(更新插入)数据透视表
【发布时间】: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(),如果相关记录已经存在,则会引发错误。

标签: laravel eloquent pivot-table


【解决方案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]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多