codeIgniter:将参数传递给上一个查询中的选择查询
Posted
技术标签:
【中文标题】codeIgniter:将参数传递给上一个查询中的选择查询【英文标题】:codeIgniter: pass parameter to a select query from previous query 【发布时间】: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:请不要删除第一块代码中的注释!
【问题讨论】:
【参考方案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/
希望这会有所帮助...
【讨论】:
以上是关于codeIgniter:将参数传递给上一个查询中的选择查询的主要内容,如果未能解决你的问题,请参考以下文章
在 Codeigniter 中,如何将第三个参数传递给回调(表单验证)?