【问题标题】:Laravel Update hasMany relationLaravel 更新 hasMany 关系
【发布时间】:2019-12-20 21:27:36
【问题描述】:

我有以下内容:

镜像模块模型

/**
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function xous()
{
    return $this->hasMany('App\Models\Xou');
}

徐模型

public function mirrorModule()
{
    return $this->belongsTo('App\Models\MirrorModule');
}

这里是基本的东西。我想要的只是更新就像 ManyToMany 中的同步方法一样,它采用id's 并为您计算出其余部分。

我有一个数组进来,看起来像这样:

我的尝试

   if ($request->has('xous')) {
            $arr = [];
            foreach ($data['xous'] as $value) {
            // $arr[] = [
            //     'id' => $value['id'],
            // ];
            // $arr[] = $value;
           $xous = Xou::findOrFail($value['id']);
          $mm = $mirrorModule->xous()->where('mirror_module_id',$mirrorModule['id'])->get(); 
          $mm->update() // ?? or save()  save returns error 

        }
    }

我还查看了这个article 来实现我自己的同步方法,但无法让它工作。

有什么想法吗?也欢迎其他方法。

【问题讨论】:

  • 你要做什么,保存$xous$mm
  • @rkj 是的。基本上用图片中的数组更新 $mm 模型
  • 你可以使用$mirrorModule->xous()->save($xous);
  • @rkj 我试过了,它返回'必须是 Illuminate\Database\Eloquent\Model 的实例,给定数组'。除非我在这里没有得到你的想法?
  • $xous = Xou::findOrFail($value['id']);之后使用,然后在$mirrorModule->xous()->save($xous);之后使用

标签: php laravel laravel-5.2


【解决方案1】:

在 id 数组上使用 whereIn

$ids = array_map(function ($item) {
    return $item['id']:
}, $request->get('xous'));

$mirrorModule->xous()->whereIn('id', $ids)->update(...);

【讨论】:

  • update 采用 2 个参数、一个字段名称和要更新的值,或者采用单个参数作为字段 => 值对的关联数组。
  • 这个方法对我不起作用。 $mirrorModule->xous()->whereIn('id', $ids)->update(['mirror_module_id' => $mirrorModule]); 没有任何反应。
  • 您是否设置了带有您要更新的属性的模型$fillable 属性?
  • 是的。然而什么也没发生。
【解决方案2】:

您在 Collection 对象上调用 ->update()->get() 返回一个 Collection 对象,而不是模型或查询。

你需要做的是(如果我理解正确的话)是

 if ($request->has('xous')) {
        $arr = [];
        foreach ($data['xous'] as $value) {
        // $arr[] = [
        //     'id' => $value['id'],
        // ];
        // $arr[] = $value;
       $xous = Xou::findOrFail($value['id']);
       $mm = $mirrorModule->xous()->where('mirror_module_id',$mirrorModule['id'])->update([
           'attribute_to_update' => 'some_value'
       ]); 

    }
}

这将基本上用 mirror_module_id 更新数据库中的所有行,并带有一些值。

【讨论】:

    【解决方案3】:

    请避免在循环中执行查询。 findOrFail 接受 id 数组,因此您可以将 id 提取到临时变量,然后进行批量更新。 更新方法接受您想要更改(更新)的参数数组。

    【讨论】:

      【解决方案4】:

      你可以跟着方式走:

       $category->posts()->update(['category_id' => $newCatId]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-16
        • 2017-05-17
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2020-03-25
        相关资源
        最近更新 更多