iDokuro
@iDokuro
Тугодум

Мозг уже кипит, что тут не так?

Привет всем. У меня проблема с кодом, он работает, но очень странно... О_о

// Upd. В примере кода - использование Phalcon

Предположим есть таблица с такими полями. Далее я её буду называть Sections
5476a60391cf47b2a52414271086afbb.png

А теперь задача

Предположим мне нужно категорию с ID 4 поставить на место категории 3. Соответсвенно категория 3 встанет на место категории 4. Всё вроде просто...

Я решил сделать перемещение так:

Так, как ID - автоикреминтируется, то 2 одинаковых ID быть не может. Я так скажем создаю временное ID которого ещё нет в таблице. (Количество строк в таблице + 1)

Далее у категории с ID 3 я изменяю ID на то, которого ещё нет в таблице.
Так как место освободилось категорию с ID 4 я перемещаю на место категории 3 (заменяю ID).

Ну а делее снова освободилось место уже из под категории 4, туда я и перемещаю категорию 3 из "временной строки".

Вроде бы логично...
В виде кода всё это выглядит так:

public function upAction ($id = 0)
    {
        $allSections    = new Sections();
        $currentSection = $allSections->findFirstById($id);
        
        if (!$currentSection)
        {
            $this->flash->warning('Категория не найдена');
            return $this->response->redirect('dashboard-section');
        }
        
        /* <Костыль> */
        $numRows       = $allSections->find()->count();// Общее количество категорий
        $notDefineId   = ++$numRows;// ID которого ещё нет в таблице. Туда временно перенесём категорию Б
        $nearbySection = $allSections->findFirst([
            'conditions' => 'id != :current_section: AND id > :current_section:',
            'bind' => [
                'current_section' => $currentSection->id
            ]
        ]);// Ищем строку ближайшую к текущей. 
        
        
        if (!$nearbySection)
        {
            $this->flash->warning('Категория и так занимает первую позицию');
            return $this->response->redirect('dashboard-section');
        }
        
        $currentId = $currentSection->id;// ID категории А
        $nearbyId  = $nearbySection->id;// ID категории Б
        
        $nearbySection->id = $notDefineId;// Перемещаем категорию Б во временную строку
        $nearbySection->save();// Сохраняем
        
        $currentSection->id = $nearbyId;// ID категории А заменяем на ID категории Б
        $currentSection->save();// сохраняем
        
        $nearbySection->id = $currentId;// перенсим категорию Б из временной строки на место категории А
        $nearbySection->save();// сохраняем
        
        $this->flash->success('Категория успешно перемещена');
        /* </костыль> */
        
        return $this->response->redirect('dashboard-section');
    }


Но при вызове метода с параметром: upAction(4) не происходит перемещения, А происходит клонирование... То есть строки не меняются местами. Строка 3 превращается в строку 4 (Значения полей становятся идентичными)

Вот наглядный результат работы:

4b529cf7b305465da4f3f6eb1899090b.png

Собственно вопрос думаю уже ясен. Почему так? почему строки не меняются местами? почему происходит клонирование?
  • Вопрос задан
  • 554 просмотра
Решения вопроса 4
@maxyc_webber
Web-программист
может легче воспользоваться тупо сортировкой. доп поле ord и в нем хранить индекс сортировки. еще как более удобное решение для каталогов советую воспользоваться nested sets
Ответ написан
@bears
Вообще, менять ID в базе - очень плохая практика. Как написал Максим Гречушников , надо вводить новое поле в базу, где будет храниться индекс сортировки для каждой категории. К категориям как правило привязываются статьи, товары и т.д. Если меняете ID категории, то получается что куча товаров/статей окажутся в другой категории. Или это Вас не смущает? ))
Я так скажем создаю временное ID которого ещё нет в таблице. (Количество строк в таблице + 1)
- это вообще ужас. В таблице было 5 категорий, вторую удалили, осталось 4. 4 строки +1 будет 5, пятый id-шник у нас занят пятой категорией, или я что-то не понимаю?
Ответ написан
Я тебе на другом сайте написал в личке :D
Ответ написан
Комментировать
@entermix
Зачем вообще менять ID? Как вам уже написали Максим Гречушников и bears , добавьте дополнительное поле, куда и сохраняйте порядковый номер
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы