PHP Moving mySQL Albero Nodo
Domanda
Sto avendo difficoltà cercando di spostare i nodi secondari o del genitore nodi su o in giù ... non che bravo in matematica.
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) unsigned NOT NULL, il testopage-title
NOT NULL,
testopage-content
NOT NULL,
page-time
int (11) NOT NULL senza segno, testopage-slug
NOT NULL,
testopage-template
NOT NULL,
page-parent
MEDIUMINT (8) unsigned NOT NULL, il testopage-type
NOT NULL, PRIMARY KEY (page-id
)) MOTORE = MyISAM DI DEFAULT 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
) VALORI (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, '');
Per esempio, come mi trasferirei TEST sopra PARENT e dire mossa SUB basso SUB-SUB giocando con gli ID di pagina a sinistra / pagina-destra? Codice non è richiesto solo aiutare con il concetto di SQL o la matematica per essa, mi avrebbe aiutato a capire come muoversi meglio ...
Soluzione
Quindi, in pratica si desidera convertire un lista di adiacenza ad un insieme nidificato? In primo luogo aggiornare la lista di adiacenza (es. Aggiornare i valori page_parent ai valori corretti per il nuovo albero), quindi eseguire la conversione di seguito.
Utilizzo di PHP (codice di base, non testato):
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
...
}
}
Quando si chiama questo, $ rawData dovrebbe contenere una serie di ID di, indicizzato da genitore-id, è possibile crearlo (in base alla struttura della tabella) come segue ($ db dovrebbe contenere un oggetto collegamento attivo DOP):
$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;
}
Per fare la conversione si avrebbe bisogno di qualcosa di simile a:
$tree = new Tree();
$tree->rebuild($rawData);
Quindi, in pratica si crea un array contenente tutti i nodi nell'albero indicizzate da un genitore che verranno attraversati in maniera ricorsiva per determinare i giusti valori corretti e sinistra per nodo.
A proposito Si potrebbe farlo in SQL pianura (dopo di adattare i nomi di tabella / colonna): http://bytes.com/topic/ mysql / risposte / 638.123-rigenerarsi-nested-set-con-parent_id-struttura