Laravel - 根据数组同步枢轴 table

Laravel - Sync pivot table according to array

我正在制作一个 VueJS 表单,用户可以在其中编辑步骤。一个步骤可以有多个父产品。逻辑是一个步骤可以属于多个产品。我有一个名为 products、product_step(pivot table) 和 steps 的 table。

用户第一次加载页面时的数组填充了该 stap 的父产品。

这个数组根据用户决定在前端做什么而改变。假设他们希望产品 n 不再有权访问此步骤。在这种情况下,产品将从数组中删除。

我面临的问题是,我不知道如何将 Pivot table 同步到此行为。

场景

假设用户加载了页面,并且此步骤包含的父产品是 [101,102]。步骤的 ID 是 2。Pivot table 想要以下

假设用户决定删除产品 101 并添加产品 104106。然后数组看起来像这样 [101, 104, 106] 但枢轴 table 也需要同步此行为。我怎样才能做到这一点?

我试过类似的方法,但这样它只能分离它,而不是在必要时添加

public function update(Request $request, $id)
    foreach($request->data['parentProducts'] as $configurableProduct) {
      $product = Product::find($configurableProduct['id']);
      $product->steps()->detach($id);
    }
}

产品型号

 /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
     */
    public function steps()
    {
        return $this->belongsToMany(Step::class, 'product_step', 'product_id', 'step_id')->orderBy('order');
    }

改变你的逻辑并不能解决你的问题。这将在给定步骤中分离和添加产品,我猜这是用户实际编辑的内容?

$step = Step::find($id);
$step->products()->sync(collect($request->data['parentProducts'])->pluck('id'));

Bonus points,你还可以使用模型绑定,为你的Step,让代码更干净。要求路由参数调用step.

public function update(Request $request, Step $step)
    $step->products()->sync(collect($request->data['parentProducts'])->pluck('id'));
}