2014-11-09 25 views
0

我有一個名爲的分類表,它存儲了我的電子商務網站的所有產品分類法。這是如何表:Laravel遞歸獲得分類的所有後代

+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name   | varchar(20)  | NO | UNI | NULL |    | 
| parent_id | int(10) unsigned | YES | MUL | NULL |    | 
| num_products | smallint(6)  | NO |  | 0  |    | 
+--------------+------------------+------+-----+---------+----------------+ 

現在給了一個分類標識,我怎麼遞歸獲得它的所有後代ID?到目前爲止,我的努力:

public function getAllTaxonomyOffspringIds($parent_id, $offspring_ids = array()) { 
    $taxonomy = Taxonomy::find($parent_id); 
    if (!is_null($taxonomy)) { 
     $first_generation_ids = $taxonomy->subtaxonomies()->lists('id'); 
     $offspring_ids = array_merge($offspring_ids, $first_generation_ids); 
     if (count($first_generation_ids) > 0) { 
      foreach ($first_generation_ids as $child_id) { 
       self::getAllTaxonomyOffspringIds($child_id, $offspring_ids); 
      } 
      // foreach ($first_generation_ids as $child_id) { 
      // $child_taxonomy = Taxonomy::find($child_id); 
      // if (!is_null($child_taxonomy)) { 
      //  $second_generation_ids = $child_taxonomy->subtaxonomies()->lists('id'); 
      //  $offspring_ids = array_merge($offspring_ids, $second_generation_ids); 
      //  if (count($second_generation_ids)) { 

      //  } 
      // } 
      // } 
     } 
    } 
    return $offspring_ids; 
} 

但它給我的只有第一代兒童的IDS ...

回答

0

這實際上是一個寬度優先樹遍歷算法,這裏是我已經設法圖碼out how:

public function getTaxonomyChildren($id) { 
    $taxonomy = Taxonomy::find($id); 
    $child_ids = array(); 
    if (!is_null($taxonomy)) { 
     $child_ids = $taxonomy->subtaxonomies()->lists('id'); 
    } 
    return $child_ids; 
} 
public function getAllTaxonomyOffspringIds($parent_id, $offspring_ids = array()) { 
    $child_ids = self::getTaxonomyChildren($parent_id); 
    $offspring_ids = array_merge($offspring_ids, $child_ids); 
    while (count($child_ids) > 0) { 
     $temp_ids = array(); 
     foreach ($child_ids as $child_id) { 
      $temp_ids = array_merge($temp_ids, self::getTaxonomyChildren($child_id)); 
     } 
     $child_ids = $temp_ids; 
     $offspring_ids = array_merge($offspring_ids, $child_ids); 
    } 
    return $offspring_ids; 
}