<?php public function moveNodeRight($id) { if ($currentNode = $this->_getNode($id)) { $query = "SELECT $this->dbTableColumns FROM (.[*1].) IMIT 1"; $this->dbDriver->query($query); $nextNode = $this->dbDriver->fetchRow(); if ($nextNode) { $currentNodeElements = ($currentNode->right - $currentNode->left +1) / 2; $restNodesElements = ($nextNode->right - $currentNode->right) / 2; $this->dbDriver->query("UPDATE `$this->dbTable` SET `(.[*2].)` cluster"); $this->dbDriver->query("UPDATE `$this->dbTable` SET `(.[*3].) cluster"); $this->dbDriver->query("UPDATE `$this->dbTable` SET (.[*4].) `left` < 0"); } } } [*1] "SELECT $this->dbTableColumns FROM `$this->dbTable` WHERE `parentId` = $currentNode->parentId AND `parentId` <> 0 AND `left` = $currentNode->right + 1 LIMIT 1" [*2] "UPDATE `$this->dbTable` SET `left` = (-1)*(`left` + ($restNodesElements*2)), `right` = (-1)*(`right` + ($restNodesElements*2)) WHERE `left` >= $currentNode->left AND `left` < $currentNode->right AND `cluster` = $currentNode->cluster" [*3] "UPDATE `$this->dbTable` SET `left` = (`left` - ($currentNodeElements*2)), `right` = (`right` - ($currentNodeElements*2)) WHERE `left` > $currentNode->right AND `left` < $nextNode->right AND `cluster` = $currentNode->cluster" [*4] "UPDATE `$this->dbTable` SET `left` = (-1)*(`left`), `right` = (-1)*(`right`) WHERE `left` < 0" ?>
Sam kod nie jest moze aż tak ważny. Istotne jest że są tam 3 "UPDEJTY" które muszą się wykonać zawsze w całości oraz żadne inne zapytanie typu UPDATE nie może się wykonać na tej tabeli pomiędzy tymi zapytaniami.
Próbowałem kilku sposobów ale chciałbym się poradzić kogoś z większym doświadczeniem bo nigdy wcześniej nie korzystałem z lock tables ani transakcji. W jaki sposób powinienem je w tym wypadku zastosować ? Moze dla nested sets tree są jakieś utarte szlaki?