带有codeigniter的多级菜单

时间:2011-11-08 17:50:30

标签: php codeigniter while-loop

我正在尝试创建一个多级列表。我有两张桌子'State'和'City'。 city表有一个外键'state_id',它是'State'表的主键。我想显示每个州和每个州下面有多个城市。但是当我运行我的代码时,只有db中的最后一个存储状态和它下面的城市出现。我希望Db和城市中的所有州对应它。

我的控制器的一部分:

function index(){
    $result = $this->db->count_all('state');

    $id=1;
    while ($id<=$result){
        $data ['state'] = $this->state_model->stateid($id);  
        $data['city']=$this->state_model->statec($id);
        $id++;
    } 
    $this->load->view('state_view',$data);
}

模特:

function stateid($id = 0){
    $this->db->where('id',$id);

    $sql = $this->db->get('state');

    return $sql->result();
}

function statec($id = 0){
    $this->db->where('state_id',$id);

    $sql = $this->db->get('city');

    return $sql->result();
}

观点:

<?php foreach($state as $row):?>
    <h4><?php echo $row->statename;?></h4>
    <?php foreach($city as $row):?>
        <?php echo $row->cityname; ?></br></br></br>
    <?php endforeach;?></br></br>
<?php endforeach;?></br></br>

1 个答案:

答案 0 :(得分:0)

那是因为在那个时候,每次迭代都会覆盖$ data ['state']和$ data ['city'] ......所以只有最后一次迭代才会被发送到视图。

您应该更多地了解哪些数组,尤其是多维数组的工作方式以及如何使用它们。

话虽如此,你还有更大的问题需要考虑。就像代码非常优化一样,以后会引起问题。就像你的代码假设状态表中的id是连续的,这不一定是真的。

以下是您的代码应该是什么样的想法:

模型

function get_cities(){

  $states = $this->db->get('state');

  foreach ($states->result() as $state){
    $cities = $this->db->get_where('city', array('state_id', $state->id));
    $state->cities = $cities->result();
  }

  return $states;
}

控制器

function index(){
  $this->load->model('state_model);
  $data['states'] = $this->state_model->get_cities();
  $this->load->view('states/index, $data);
}

视图:

<?php foreach($states as $state):?>
  <h4><?php echo $state->statename;?></h4>
  <?php  foreach($state->city as $city):?>
    <?php echo $city->cityname; ?>
  <?php endforeach;?>
<?php endforeach;?>
祝你好运