PHP Déplacement mySQL Arbre Noeud
Question
Je ne parviens pas à essayer de déplacer des nœuds sous ou parent nœuds ou vers le bas ... pas bon en maths.
CREATE TABLE IF NOT EXISTS `pages` ( `page-id` mediumint(8) unsigned
NOT NULL AUTO_INCREMENT,
page-left
MEDIUMINT (8) unsigned NOT NULL,
page-right
smallint (8) pas non signé NULL, textepage-title
NOT NULL,
textepage-content
NOT NULL,
page-time
int (11) non signé NOT NULL, textepage-slug
NOT NULL,
textepage-template
NOT NULL,
page-parent
MEDIUMINT (8) unsigned NOT NULL, textepage-type
NOT NULL, Clé primaire (page-id
)) MOTEUR = DEFAULT MyISAM charset = latin1 ;INSERT INTO
pages
(page-id
,page-left
,page-right
,page-title
,page-content
,page-time
,page-slug
,page-template
,page-parent
,page-type
) VALEURS (17, 1, 6, '1', '', 0, 'PARENT', '', 0 ''), (18, 2, 5, '2', '', 0, 'SUB', '', 17 ''), (19, 3, 4, '3' '', 0, 'SUB-SUB', '', 18 ''), (20, 7, 8, '5', '', 0, 'TEST', '', 0 '');
A titre d'exemple comment pourrais-je passer au-dessus TEST DE PARENT et dire déplacer SUB-bas SUB SUB en jouant avec la page gauche / ID de page à droite? Code n'est pas nécessaire qu'aider avec le concept SQL ou mathématiques pour cela, me aider à comprendre comment se déplacer mieux ...
La solution
Donc, fondamentalement, vous voulez convertir une liste de contiguïté à un ensemble imbriqué? première mise à jour votre liste de contiguïté (ie. les mettre à jour les valeurs de page_parent aux valeurs correctes pour votre nouvel arbre), puis exécutez la conversion ci-dessous.
En utilisant PHP (code de base, non testé):
class Tree
{
private $count = 0;
private $data = array();
/**
* Rebuild nested set
*
* @param $rawData array Raw tree data
*/
public function rebuild($rawData)
{
$this->data = $rawData;
$this->count = 1;
$this->traverse(0);
}
private function traverse($id)
{
$lft = $this->count;
$this->count++;
if (isset($this->data[$id])) {
$kid = $this->data[$id];
if ($kid) {
foreach ($kid as $c) {
$this->traverse($c);
}
}
}
$rgt = $this->count;
$this->count++;
// TODO: Update left and right values to $lft & $rgt in your DB for page_id $id
...
}
}
Lorsque vous appelez cela, $ rawData doit contenir un tableau de numéro d'identité, indexé par parent-id, vous pouvez créer (en fonction de votre structure de table) comme suit ($ db doit contenir un objet de connexion active AOP):
$sql = 'SELECT page_id, page_parent FROM pages ORDER BY page_parent';
$stmt = $db->prepare($sql);
$rawData = array();
$stmt->execute();
while ($row = $stmt->fetch()) {
$parent = $row['page_parent'];
$child = $row['page_id'];
if (!array_key_exists($parent, $rawData)) {
$rawData[$parent] = array();
}
$rawData[$parent][] = $child;
}
Pour faire la conversion vous besoin de quelque chose comme:
$tree = new Tree();
$tree->rebuild($rawData);
Donc, fondamentalement, vous créez un tableau qui est contenant tous les nœuds dans l'arborescence indexés par des parents qui sera traversé d'une manière récursive pour déterminer la bonne gauche et à droite par nœud.
BTW Vous pouvez le faire en SQL (après vous adaptez les noms de table / colonne): http://bytes.com/topic/ mysql / réponses / 638123-régénéré-nested-set-utilisant-parent_id structure