【问题标题】:codeIgniter: pass parameter to a select query from previous querycodeIgniter:将参数传递给上一个查询中的选择查询
【发布时间】:2010-04-08 09:37:49
【问题描述】:

我正在为浏览器游戏 travian 创建一个小管理工具。所以我从数据库中选择了所有的村庄,我想展示每个村庄独有的一些内容。但是为了查询那些独特的细节,我需要传递村庄的 ID。我该怎么做?

这是我的代码(控制器):

function members_area()
    {
        global $site_title;
        $this->load->model('membership_model');

        if($this->membership_model->get_villages())
        {
            $data['rows'] = $this->membership_model->get_villages();
            $id = 1;//this should be dynamic, but how?
            if($this->membership_model->get_tasks($id)):
                $data['tasks'] = $this->membership_model->get_tasks($id);
            endif;
        }

        $data['title'] = $site_title." | Your account";
        $data['main_content'] = 'account';
        $this->load->view('template', $data);
    }

这是我在模型中使用的两个函数:

function get_villages()
{
    $q = $this->db->get('villages');

    if($q->num_rows() > 0) {
        foreach ($q->result() as $row) {
            $data[] = $row;
        }
    return $data;
    }
}

function get_tasks($id)
{
    $this->db->select('name');
    $this->db->from('tasks');
    $this->db->where('villageid', $id);

    $q = $this->db->get();

    if($q->num_rows() > 0) {
        foreach ($q->result() as $task) {
            $data[] = $task;
        }
    return $data;
    }
}

当然还有观点:

<?php foreach($rows as $r) : ?>
        <div class="village">
            <h3><?php echo $r->name; ?></h3>
            <ul>
                <?php foreach($tasks as $task): ?>
                    <li><?php echo $task->name; ?></li>
                <?php endforeach; ?>
            </ul>
            <?php echo anchor('site/add_village/'.$r->id.'', '+ add new task'); ?>
        </div>
    <?php endforeach; ?>

ps:请不要删除第一块代码中的注释!

【问题讨论】:

    标签: codeigniter parameters model view controller


    【解决方案1】:

    同意以上两个,加入他们:)

    membership_model 函数:

    function get_villages_and_tasks() {
      $query_results = $this->db
      ->select('villages.id,villages.name AS villagename,tasks.name AS taskname',false)
      ->join('tasks','tasks.villageid = villages.id','left')
      ->get('villages')->result_array();
    
      $return_array = array();
    
      foreach($query_results as $row) {
        if(!isset($return_array[$row['id']]) {
          $return_array[$row['id']] = array(
            'villagename'=>$row['villagename']
          );
        } 
        if(!empty($row['taskname'])) {
          $return_array[$row['id']]['tasks'][]=array('taskname'=>$row['taskname']);
        }
      }
      return $return_array;
    }
    

    查看:

    <?php foreach($villages as $villageid=>$village) : ?>
      <div class="village">
        <h3><?php echo $village['villagename']; ?></h3>
        <ul>
          <?php if(!empty($village['tasks'])): ?>
            <?php foreach($village['tasks'] as $task): ?>
              <li><?php echo $task['taskname']; ?></li>
            <?php endforeach; ?>
          <?php endif; ?>
        </ul>
        <?php echo anchor('site/add_village/'.$villageid.'', '+ add new task'); ?>
      </div>
    <?php endforeach; ?>
    

    【讨论】:

    • 很好地实现了连接并将结果集从 2D 转换为 3D。这就是这样做的方法。
    【解决方案2】:

    使用您当前的模型函数,您可以迭代村庄,获取每个村庄的任务。

    function members_area()
    {
        global $site_title;
        $this->load->model('membership_model');
    
        // Fetch villages
        $villages = $this->membership_model->get_villages();
    
        if($villages)
        { 
            $tasks = array();
    
            // Iterate through villages fetching tasks
            foreach ($villages as $village)
            {
                $tasks[$village->id] = $this->membership_model->get_tasks($village->village->id);
            }
    
            $data['villages'] = $villages;
            $data['tasks'] = $tasks;
        }
    
        $data['title'] = $site_title." | Your account";
        $data['main_content'] = 'account';
        $this->load->view('template', $data);
    }
    

    但这需要 N+1 个 SQL 查询,其中 N 是村庄的数量。更好的解决方案是通过将任务表连接到村子表中,在一个查询中获取所有数据。

    【讨论】:

      【解决方案3】:

      我在本周早些时候的 Codeigniter 论坛上提出了一个我认为相关的问题。

      http://ellislab.com/forums/viewthread/151624/

      希望这会有所帮助...

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 2014-08-23
        相关资源
        最近更新 更多