我有以下内容:
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
并为您找出其余的方法。
我收到了一个看起来像这样的数组:
我尝试过的事情
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来实现自己的同步方法,但是无法正常工作。
有什么想法吗?也欢迎其他方法。
答案 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]);