Laravel 如何能做到有效及优雅地进行批量UPDATE?
我的情况是,我想用 SortableJS/Sortable
做菜单/导航管理
功能及效果已经完成了,只不过我用了很愚蠢的方法,很不优雅的代码去做
database tabe menu
id (int) PK
fid (int) //父级id
name (int)
sort (int) //排序
Model中做了个子项目的function
//Models/Menu.php
public function childs() {
return $this->hasMany(Menu::class, 'fid', 'id');
}
现在js一般都是用json 返回消息的
那么我会先$menus = json_decode($request->menus, true);
dd($menus)
得到以下内容:
array:2 [▼
0 => array:2 [▼
"id" => "5"
"children" => array:4 [▼
0 => array:2 [▼
"id" => "6"
"children" => []
]
1 => array:2 [▼
"id" => "7"
"children" => []
]
2 => array:2 [▼
"id" => "8"
"children" => []
]
3 => array:2 [▼
"id" => "9"
"children" => []
]
]
]
1 => array:2 [▼
"id" => "1"
"children" => array:3 [▼
0 => array:2 [▼
"id" => "3"
"children" => []
]
1 => array:2 [▼
"id" => "4"
"children" => []
]
2 => array:2 [▼
"id" => "2"
"children" => []
]
]
]
]
我用了个极为愚蠢
的方法来先让他有效
$sql = '';
foreach ($menus as $k => $v) {
$id = $v['id'];
$sql .= "UPDATE `menu` SET `fid` = 0 ,`sort` ='$k' WHERE `menu`.`id` = '$id';";
if ($v['children']) {
foreach ($v['children'] as $children_k => $children_v) {
$children_id = $children_v['id'];
$sql .= "UPDATE `menu` SET `fid` = '$id' ,`sort` ='$children_k' WHERE `menu`.`id` = '$children_id';";
}
}
}
DB::unprepared($sql);
不知各位有什么高见?
不能用Eloquent去做就算了,但竟然要用到unprepared()
,感觉自己技术还是十分不行,想来请各位指点一二
顺带一提,在显示时,orderBy('sort','ASC')
当然是没问题的,但是子项目却不行,我只能在blade做了,这个地方有什么更聪明的吗?
$row = Menu::where('fid', 0)->orderBy('sort', 'ASC')->get();
@foreach($row as $menu)
<li data-id="{{ $menu->id }}"> {{ $menu->name }}
@if(count($menu->childs))
@foreach($childs->sortBy('sort') as $child)
.....
@endforeach
@endif
</li>
@endforeach
不是求代码 本来这功能就是给后台/管理级别的人使用,功能都实现了,即使效率慢一点也没关系,只是抱著好奇的心来讨教一下,有没有更安全、更聪明一点的方法去完成
文档上upsert()的方法踩过了吗?
快速入门《Laravel 9 中文文档》