0

私は次の表を持っています:

id      name                       lft     rgt     level
---     -------------------------  ----    ----    -----
1       company name                1       16      0
2       HR                          2       3       1
3       Superwiser                  4       9       1
4       Associates                  5       6       2
5       test                        10      13      1
6       test2                       11      12      2

このデータベースを使用して、ulliタグでツリー構造を表示したいと思います。しかし、このテーブルを取得していません。このように表示したい:

1. Company Name
|--:Hr  
|--:Superwiser  
   |--:Associates  
|--:test  
   |--:test2

これに対して特定のクエリを実行するにはどうすればよいですか。また、ulliタグで表示する方法を教えてください。前もって感謝します。

4

3 に答える 3

1
<?php

クラスカテゴリ{

var $table='';
    var $CI ='';
    var $ul_class='';

    function Category($config=array()){
        $this->table=$config['table'];
        $this->CI=& get_instance();
        $this->CI->load->database();
        $this->ul_class=$config['ul_class'];
    }
    function getTree($parent_id=0){

       $this->CI->db->where('parent_id',$parent_id);
       $first_level=$this->CI->db->get('category')->result();
       $tree= '<ul class="'.$this->ul_class.'">';
       foreach($first_level as $fl){
           $tree.='<li>'.$fl->name;
            $this->CI->db->where('parent_id',$fl->cat_id);

           $count=$this->CI->db->count_all_results($this->table);

           if($count!=0){
               $tree.=$this->getTree($fl->cat_id);
           }
           $tree.= '</li>';
       }
       $tree.= '</ul>';

       return $tree;
    }

}?>

このライブラリを使用する

于 2012-07-25T05:16:02.327 に答える
1

CREATE TABLE IF NOT EXISTS categorycat_idint(11)NOT NULL AUTO_INCREMENT、 namevarchar(255)COLLATE utf8_bin DEFAULT NULL、 imagevarchar(255)COLLATE utf8_bin DEFAULT NULL、 parent_idint(11)NOT NULL DEFAULT '0'、 toptinyint(1)NOT NULL、 columnint(3)NOT NULL、 sort_orderint(3)NOT NULL DEFAULT '0'、 statustinyint(1)NOT NULL、 total_productint(11)NOT NULL、 date_addedint(11)NOT NULL、 date_modifiedint(11)NOT NULL、PRIMARY KEY(cat_id) )ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_bin AUTO_INCREMENT = 17;

これは私のデータベーステーブルであり、このテーブルを使用してツリーを作成します。これが私の関数です

function getTree(){
$config['ul_class']='tree';
$config['table']='category';
$this->load->library('category',$config);
echo $this->category->getTree();
}

とライブラリは同じです

<?php

クラスカテゴリ{

var $table='';
    var $CI ='';
    var $ul_class='';

    function Category($config=array()){
        $this->table=$config['table'];
        $this->CI=& get_instance();
        $this->CI->load->database();
        $this->ul_class=$config['ul_class'];
    }
    function getTree($parent_id=0){

       $this->CI->db->where('parent_id',$parent_id);
       $first_level=$this->CI->db->get('category')->result();
       $tree= '<ul class="'.$this->ul_class.'">';
       foreach($first_level as $fl){
           $tree.='<li>'.$fl->name;
            $this->CI->db->where('parent_id',$fl->cat_id);

           $count=$this->CI->db->count_all_results($this->table);

           if($count!=0){
               $tree.=$this->getTree($fl->cat_id);
           }
           $tree.= '</li>';
       }
       $tree.= '</ul>';

       return $tree;
    }

}?>

このクラスファイルは、ファイル名カテゴリのアプリケーションフォルダのライブラリフォルダ内に保存する必要があります

于 2012-07-27T06:20:00.563 に答える
0

再帰的なデータベース呼び出しは悪魔の兆候であるため、私が通常これを処理する方法は、PHP自体を使用することです。

すなわち

function buildTree($ParentID, $Categories, $Output = '')
{
    foreach($Categories as $Category)
    {
        // Skip any categories that are not
        // in the current parent.
        if($Category->ParentID != $ParentID)
            continue;
        // Add the current category to the output
        $Output .= '<li>' . $Category->name . '</li>';
        // If the category has children, recurse another level.
        if($Category->ChildCount > 0)
        {
            $Output .= '<ul>';
            $Output .= $this->buildTree($Category->ID, $Categories, $Output);
            $Output .= '</ul>';
        }
    }
    return $Output;
}

次に、単に次のように呼び出します。

<ul><?= buildTree(0, $Categories); ?></ul>

このコードは、その親行に属する子行の数を返すサブクエリを実行することに依存しています。

すなわち

select *, (select count(C2.*) from Category C2 where C2.ParentID = C1.ID) as ChildCount from Category as C1

これにより、親ノードに実際に子がある場合にのみ再帰を続行でき、UL子が存在しない場合に空が出力に追加されるのを防ぐことができます。

于 2012-07-25T08:48:23.790 に答える