0

所以我有一个菜单表,id,title,parent_id

我已将一些内容字段附加到菜单的最底层(假设 id = 50),那么如果我单击该树菜单的顶部父级(id = 1),我希望它显示附加的内容到子菜单(不管多深),所以我想我需要遍历父母,你能帮我解释一下这个逻辑吗?

控制器:

    $data['query'] = $this->item_model->getByType($menu_id);

该模型:

function getByType($menu_id) {
    if($menu_id) {
        $q = $this->db->get_where('menus', array('id' => $menu_id));
        $parent_id = $q->row()->parent_id;
    }else{
        return;
    }
    $this->db->select('*');
    $this->db->from('items');
    $this->db->where('menu_id', $menu_id);
    $this->db->or_where('menu_id', $parent_id);
    $query = $this->db->get();
    return $query;
}

所以到现在为止,如果我点击他的父级(2级),我只能得到一些菜单,但是如何使它无限深?,我想这里我需要循环or_where,你能帮我吗接着就,随即?

4

1 回答 1

2

嗯……递归

function getChildrenAttachments($menu_id) {
    // invalid menu id
    if(!$menu_id) return;
    // get all rows with this parent id
    $query = $this->db->get_where('menus', array('parent_id' => $menu_id));
    // result will hold all the attachments
    $result = array();
    // loop through results
    foreach($query->result() as $row) {
        // does this row have an attachment?
        if($row->attachment!='') {
            $result[] = $row->attachment;
        }
        // add all children attachments
        $result = array_merge($result, getChildrenAttachments($row->id));
    }
    // return result set
    return $result
}

这个实现没有考虑当前menu_id实际有一个附件。您可以创建一个新函数,该函数考虑getAttachmentsForTree()检查当前 id 的内容,然后将 id 传递给getChildrenAttachments()...

PS 我还没有运行代码,所以对于代码可能出现的任何问题,我深表歉意。这只是一个示例,说明如何在这种情况下利用递归来发挥自己的优势。

于 2013-02-15T07:56:17.310 回答