Изменить порядок в laravel - PullRequest
       1

Изменить порядок в laravel

1 голос
/ 10 января 2020

У меня небольшая проблема ... Я хочу, чтобы в столбце были упорядочены некоторые данные, например: ...

enter image description here

и когда Я сделал форму для редактирования, я могу изменить порядок, как я хочу, без повторения любого числа в этом порядке ...

, как я хочу здесь .. Я хочу изменить заказ test3 на 1, так что результат будет

enter image description here

этот код обновления моего контроллера

$order_id = Section::where('section_id', $request->section_id)->get();
$edit_order=$order_id[0]['section_order'];

$request_order=$request->section_order;


for ($i = $request_order; $i <= $edit_order ; $i++) {

    $siction_data = Section::where('section_order', $i)->get();
    $edit_siction_id=$siction_data[0]['section_id'];
    $edit_siction_order=$siction_data[0]['section_order']+1;


if ($siction_data[0]['section_order']===$edit_order) {
    $edit_siction_order=(int)$request_order;
}

$update_data= array(
    'section_order' => $edit_siction_order,
);

Section::where('section_id', $edit_siction_id)->update($update_data);

}

Но ничего не происходит ...

PLZ, помогите мне или даже у вас есть лучший код, чтобы сделать процесс быстрее особенным, когда я хочу изменить заказ test1000 на 1

Ответы [ 2 ]

1 голос
/ 10 января 2020

Вот простая логика c для этого:

Предположим, х - это новый ордер, который вы хотите присвоить элементу. У нас есть два сценария ios:

  1. Если 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`')
        ]);
0 голосов
/ 10 января 2020

Функция .get() возвращает массив объектов коллекции, а не массивов, поэтому вам нужно обращаться с ними таким образом. Также есть более простой способ сделать то, что вы пытаетесь сделать. Лучше использовать .first(), если вы хотите извлечь один элемент и потерять [0]:

$order_id = Section::where('section_id', $request->section_id)->first();
$edit_order=$order_id->section_order;

$request_order=$request->section_order;


for ($i = $request_order; $i <= $edit_order ; $i++) {
    $siction_data = Section::where('section_order', $i)->first();    
    if ($siction_data->section_order===$edit_order) {
        $edit_siction_order=(int)$request_order;
    }else{
        $edit_siction_order= (int)$siction_data->section_order + 1
    }

    $siction_data->section_order=$edit_siction_order;
    $siction_data->save();
}

Из вашей ошибки в столбце id кажется, что у вас section_id в качестве основного ключ, чтобы Laravel знал, что вам нужно указать его в вашей модели:

class Section extends Model{
    protected $primaryKey  = 'section_id';
    //the rest of your model code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...