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? Комментарии: 4
Извините, первый раз, про «кат» поздно заметил…
По производительности ваш вариант лучше будет, чем делать «по уму».
Согласен, знаю. Но он зависим от используемого типа БД (mysql), ведь так?
Да и просто хочется понять, как реализуются такие очевидные с точки зрения sql запросы в modX. Неужели передается массив уже пересчитанных значений?
Да и просто хочется понять, как реализуются такие очевидные с точки зрения sql запросы в modX. Неужели передается массив уже пересчитанных значений?
Конкретно такой запрос сработает на любой SQL-БД.
updateCollection не такого. Ну можно получить все узлы в итератор и прогнать по всем, но это O(n) запросов к базе
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();
}
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.