Привет всем. У меня проблема с кодом, он работает, но очень странно... О_о
// Upd. В примере кода - использование Phalcon
Предположим есть таблица с такими полями. Далее я её буду называть Sections
А теперь задача
Предположим мне нужно категорию с 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 (Значения полей становятся идентичными)
Вот наглядный результат работы:
Собственно вопрос думаю уже ясен. Почему так? почему строки не меняются местами? почему происходит клонирование?