updateCollection set values

Есть CMP, на ней дерево — рубрикатор, упорядоченный по полю `order` в базе. При удалении узла нужно уменьшить на единицу order у всех узлов в той же ветке, но с бОльшим ордером. Но суть не в том.
Я сделал:
$t = $this->modx->getTableName($this->classKey);
$sql = "UPDATE $t SET `rubr_order` = `rubr_order` - 1 WHERE `rubr_parent` = $parent AND `rubr_order` > $order";
$q = $this->modx->query($sql);
А хочется по уму, без сырых запросов, через updateCollection или newQuery->command('UPDATE').
Собственно, вопрос: как прописать
`rubr_order` = `rubr_order` - 1
в массив новых значений updateCollection?
Kirill A. Rusanov
28 декабря 2012, 07:05
modx.pro
1 362
0

Комментарии: 4

Kirill A. Rusanov
28 декабря 2012, 11:06
0
Извините, первый раз, про «кат» поздно заметил…
    Виталий Киреев
    28 декабря 2012, 13:34
    0
    По производительности ваш вариант лучше будет, чем делать «по уму».
      Kirill A. Rusanov
      28 декабря 2012, 13:39
      0
      Согласен, знаю. Но он зависим от используемого типа БД (mysql), ведь так?
      Да и просто хочется понять, как реализуются такие очевидные с точки зрения sql запросы в modX. Неужели передается массив уже пересчитанных значений?
        Виталий Киреев
        28 декабря 2012, 13:59
        0
        Конкретно такой запрос сработает на любой SQL-БД.
        updateCollection не такого. Ну можно получить все узлы в итератор и прогнать по всем, но это O(n) запросов к базе
        $nodes  = $modx->getIterator($this->classKey, 
        	array('rubr_parent' => $parent, 'rubr_order:>' => $order));
        foreach ($nodes as $node) {
             $node->set('rubr_order', $node->rubr_order - 1);
             $node->save();
        }
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      4