Laravel Update hasMany关系

时间:2018-07-30 08:26:31

标签: php laravel laravel-5.2

我有以下内容:

MirrorModule模型

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

Xou模型

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

基本内容。我想要的就是像ManyToMany中的sync方法那样更新,它采用id's并为您找出其余的方法。

我收到了一个看起来像这样的数组:

enter image description here

我尝试过的事情

   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来实现自己的同步方法,但是无法正常工作。

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

4 个答案:

答案 0 :(得分:1)

在一组ID上使用whereIn

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

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

答案 1 :(得分:0)

您要在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更新数据库中的所有行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以按照以下方式操作:

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