2013-05-21 69 views
1

我嘗試將樹結構從一個數據庫表複製到另一個。該結構是一個鄰接列表模型。它看起來像:複製樹結構遞歸 - 鄰接列表模型

id|parent_id|position 
1|0|1 
2|1|1 
3|1|2 
4|0|2 
5|4|1 

這是必要,該ID是在其他表再生(AUTOINC)!我有以下功能:

/** 
* Copy a single node and return the new id 
*/ 
public function copyNode($sn_data){ 
    $this->db2->insert('items_configurations', $sn_data); 
    return $this->db2->insert_id(); 
} 

/** 
* Return a list of child nodes as an assoziative array 
* from a given parent 
*/ 
public function childList($parent_id){ 
    $tmp = 'SELECT parent_id,item_id,template_id,position FROM items_templates WHERE parent_id='.$parent_id; 
    $tmp .= ' ORDER BY position'; 
    $query=$this->db2->query($tmp); 
    return $query->result_array(); 
} 

/** 
* Copy the whole tree structure through an recursive function 
*/ 
public function copyTree($node_data,$given_parent){ 
    $new_parent = $this->copyNode($node_data); 
    $new_data = $this->childList($node_data['id']); 
    if(is_array($new_data)){ 
     foreach($new_data as $new_node_data) : 
      $new_node_data['parent_id'] = $given_parent; 
      $new_node_data['configuration_id'] = $node_data['configuration_id']; 
      $this->copyTree($new_node_data,$new_parent); 
     endforeach; 
    } 
} 


/** 
* First call of the function for example: 
*/  
$this->copyTree(array('parent_id' => 0,'item_id' => 40,'template_id' => 6,'position' => 1),0); 

我想做遞歸,但它只複製前兩行。錯誤在哪裏?

回答

1

1.在遞歸運行時,必須使用當前節點id作爲parent_id。而你正在使用它的PARENT_ID在childList

parent_id='.$parent_id; 

必須 PARENT_ID =」 $ ID;

您正在獲得此節點的同齡人,而不是孩子。

2.Also我懷疑有關標線:

if(is_array($new_data)){ 
    foreach($new_data as $new_node_data) : 
     $new_node_data['parent_id'] = $new_parent;//<-- 
     $this->copyTree($new_node_data); 
    endforeach; 
} 

因爲你有一個新PARENT_ID,然後用舊錶中的childList功能使用它。檢查參數是否正確。

+0

嗨,先謝謝。如果我這樣做,就像你告訴ID已被複制一樣!這是不正確的,也是我的主要問題。我必須將樹結構從表1複製到表2,但表2中的id由autoinc生成!例如,如果我想複製樹兩次或在表2中更改它。 – fillibuster

+0

@grolle將新的parent_id作爲單獨的參數傳遞並在'copyNode'函數中使用 – user4035

+0

嗨,謝謝,我編輯了我的第一篇文章,但它不工作?!另一件事是如何處理第一級項目(parent_id = 0)? – fillibuster