首页  >  问答  >  正文

Laravel问题:更新hasMany关系记录的问题

<p>我有一个与品牌模型有 hasMany 关系的用户模型,并且我在正确更新用户的品牌时遇到问题。</p> <p>我有一个表单,允许用户在文本字段中输入/删除/更新他们自己的品牌,我当前使用的在用户输入或编辑品牌后更新用户品牌的方法是删除所有现有品牌与用户关联,然后循环值,创建品牌模型,然后“saveMany”...但是我在添加时似乎遇到了约束冲突...我想知道是否有更好的方法来做到这一点;< /p> <p>我的<code>User</code>模型有以下内容;</p> <pre class="brush:php;toolbar:false;">public function brands() { return $this->hasMany('Brands::class'); } </pre> <p>然后在我的控制器中,我有以下代码来更新品牌;</p> <pre class="brush:php;toolbar:false;">$user->brands()->delete(); foreach ($request['brands'] as $brand) { $brandArray[] = new Brand([ 'name' => $brand['name'], 'rating' => $brand['rating'], ]); } !empty($brandArray) && $user->brands()->saveMany($brandArray); </pre> <p>有更好的方法吗?</p>
P粉054616867P粉054616867388 天前471

全部回复(1)我来回复

  • P粉702946921

    P粉7029469212023-08-31 11:27:59

    让我们将事情分成三个部分:

    # 约束键违规:

    如果您在另一个表上添加了外键约束,并且需要删除品牌,则还应该删除所有受外键约束的相关数据。

    # 设计

    如果无法删除品牌相关数据,那么也许我们可以考虑是否有更好的设计。也许我们可以在前端添加一个钩子,每当用户删除某些数据时调用 DELETE API。

    # 查询

    如果品牌有一些唯一的密钥,您可以使用 upsert 而不是 saveMany。这样效率会更高。

    #结论

    我建议每当用户删除品牌时,通过前端的钩子删除品牌,并使用 upsert 来处理创建和更新内容

    回复
    0
  • 取消回复