需要重新排序 sort_column Yii2

Need reorder sort_column Yii2

我需要重新排序列 sort_order。 就是,select分配类别的位置和 重新计算 table.

例如,如果我 select 类别 3,则在下一个插入并重新排序 sort_order。

我试过这段代码,但有问题:

       public function actionUp($id) {
               $model = $this->loadModel($id);

                $prev = Category::find()
                ->andWhere(['<', 'sort_order', $model->sort_order])
                ->orderBy(['sort_order' => SORT_DESC])
                ->limit(1)->one();

                $current = $model->sort_order;
                $model->sort_order = $prev->sort_order;
                $prev->sort_order = $current->sort_order;

                $model->save();
                $prev->save();
                return $
        this->redirect(['index']);
       }

如何重新排序此列? 感谢您的帮助。

  public function actionUp($id, $newPosition=null) {
               $model = Category::findOne($id);
               if(!$model)
                  throw new UserException('We were unable to find a matching record');


                $prev = Category::find()
                ->andWhere(['<', 'sort_order', $model->sort_order])
                ->orderBy(['sort_order' => SORT_DESC])
                ->limit(1)->one();

                if($prev)
                  $prevOrder = $prev->sort_order;
                else    
                 $prevOrder = 0;

                 $currentOrder = $model->sort_order;

                 If($newPosition)
                       $model->sortOrder = $newPosition;
                 else 
                       $model->sort_order = $prevOrder;
            $prev->sort_order = $currentOrder;


                $model->save();
                $prev->save();
                return $this->redirect(['index']);
       }

我有这个,在分类服务中 public 函数 moveUp($id){

$model = $this->categories->get($id);

        $prev = Category::find()
            ->andWhere(['<', 'sort_order', $model->sort_order])
            ->orderBy(['sort_order' => SORT_DESC])
            ->limit(1)->one();

        if($prev)
            $prevOrder = $prev->sort_order;
        else
            $prevOrder = 0;

        $currentOrder = $model->sort_order;
        $model->sort_order = $prevOrder;
        $prev->sort_order = $currentOrder;


        $prev->save();
        $this->categories->save($model);
}

你是对的,其中一个类别没有sort_order,它是空的,它给出了错误。

我还有一个问题,它怎么能做同样的事情,但是,在创建时选择放置它的位置?

actionUp and Down work well, thank you very much 

And when I'm going to add a new category, how can I indicate the position, based o parent_id?

public function create(CategoryCreateForm $form): Category
    {
        $channel = Category::create(
            $form->parentId,
            $form->name,
            $form->code,
            $form->description
        );

        $category = $this->categories->get($form->parentId);

        $next = Category::find()
            ->andWhere(['<', 'sort_order', $category->sort_order])
            ->orderBy(['sort_order' => SORT_DESC])
            ->limit(1)->one();

        if ($next)
            $nexOrder = $next->sort_order;
        else
            $nexOrder = 0;
        $currentOrder = $category->parent_id;
        if ($newPosition)
            $category->parent_id =$newPosition;
        else
             $category->parent_id = $nexOrder;
        $next->sort_order = $currentOrder;

        $prev->save();
        $this->categories->save($category);
        return $category;

    }

It does not work this way, what is wrong.