【问题标题】:Laravel - Sync pivot table according to arrayLaravel - 根据数组同步数据透视表
【发布时间】:2021-05-21 13:51:46
【问题描述】:

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

用户第一次加载页面时的数组中填充了此步骤拥有的父产品。

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

我面临的问题是,我不知道如何将数据透视表同步到这种行为。

场景

假设用户加载页面并且此步骤具有的父产品是[101,102]。该步骤的 ID 为 2。数据透视表如下所示

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

我尝试过类似的方法,但这样只能将其分离,不能在必要时添加

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');
    }

【问题讨论】:

  • 查看文档:laravel.com/docs/8.x/…。您可以致电$product->steps()->sync($ids)$step->products()->sync($ids)。 Sync 将附加在$ids 中找到的 id,并分离任何不是的。

标签: php database laravel eloquent pivot


【解决方案1】:

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

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

奖励积分,您还可以为您的 Step 使用模型绑定,并使代码更加简洁。要求路由参数被称为step。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多