Вот простая логика c для этого:
Предположим, х - это новый ордер, который вы хотите присвоить элементу. У нас есть два сценария ios:
- Если x меньше текущего порядка элемента.
В этом случае вы просто увеличиваете поле порядка всех другие строки, где порядок больше или равен x. Затем назначьте x в качестве заказа для элемента.
Если x меньше текущего порядка элемента.
Здесь вы уменьшаете поле порядка всех других строк, где порядок меньше или равен x. А затем назначьте x в качестве порядка для элемента.
$order_id = Section::where('section_id', $request->section_id)->first();
$key = $order_id->getKey();
$edit_order=$order_id->section_order;
$request_order=$request->section_order;
if($request_order< $edit_order){
Section::where('section_order','>=',$request_order)
->where('section_order','<',$edit_order)
->update([
'section_order' => DB::Raw('section_order + 1')
]);
}else{
Section::where('section_order','<=',$request_order)
->where('section_order','>',$edit_order)
->update([
'section_order' => DB::Raw('section_order - 1')
]);
}
Section::find($key)->update([
'section_order' => $request_order
]);
РЕДАКТИРОВАТЬ: Как переназначить столбец section_order с непрерывными целыми числами
Предполагая, что id является первичным ключом вашей модели раздела.
$subQuery = Section::orderBy('section_order')
->selectRaw('id, @re_order := (CASE WHEN @re_order IS NULL THEN 0 ELSE @re_order END) + 1 re_order')
->getQuery();
Section::joinSub($subQuery, 'reOrderTable', function ($join) {
$join->on('reOrderTable.id', '=', 'sections.id');
})
->update([
'sections.section_order' => DB::raw('`re_order`')
]);