2010-06-14 92 views
0

这是我发现自己几次的情况,我只想彻底清除它。使用Code Igniter控制器创建foreach循环并查看

最好只是告诉你我需要在一些示例代码中做什么。

我的控制器

function my_controller() 
{ 

$id = $this->uri->segment(3); 

$this->db->from('cue_sheets'); 
$this->db->where('id', $id); 
$data['get_cue_sheets'] = $this->db->get(); 

$this->db->from('clips'); 
$this->db->where('sheet_id', ' CUE SHEET ID GOES IN HERE ??? '); 
$data['get_clips'] = $this->db->get(); 

$this->load->view('show_sheets_and_clips', $data); 

} 

我查看

<?php if($get_cue_sheets->result_array()) { ?> 
    <?php foreach($get_cue_sheets->result_array() as $sheetRow): ?> 
     <h1><?php echo $sheetRow['sheet_name']; ?></h1> 
     <br/> 
     <?php if($get_clips->result_array()) { ?> 
      <ul> 
       <?php foreach($get_clips->result_array() as $clipRow): ?> 
        <li><?php echo $clipRow['clip_name']; ?></li> 
       <?php endforeach; ?> 
      </ul> 
     <?php } else { echo 'No Clips Found'; } ?> 
    <?php endforeach; ?> 
<?php } ?> 

所以基本上我想显示张数,然后在每个这些表属于该剪辑的片。

我希望这对那里的人有意义。

感谢,

回答

3

的代码点火器论坛用户想出了下面的解决方案。原来的线程是here

单独为每张纸查找剪辑效率不高。使用JOIN查询同时获取两个列表。

// get the data 
$this->db->from('cue_sheets'); 
$this->db->where('cue_sheets.id', $id); 
$this->db->join('clips', 'clips.sheet_id = cue_sheets.id', 'left'); 
$rawdata = $this->db->get()->result_array(); 
// prepare the data into a multidimensional array 
$data = array(); 
foreach($rawdata as $row) 
{ 
    // if this is the first clip of a new sheet, make a new entry for it 
    if (!isset($data[$row['id']])) 
    { 
    $data[$row['id']] = $row; 
    $data[$row['id']]['clips'] = array(); 
    } 

    // add the current clip to the sheet 
    $data[$row['id']]['clips'][] = $row; 
} 

现在,在你看来,你就可以通过表环和内,通过夹循环:再次

foreach($data as $sheet) { 
    // make header etc. 
    if (sizeof($sheet['clips'])) 
    { 
    foreach($sheet['clips'] as $clip) 
    { 
     // show clip 
    } 
    } else { 
    // show 'no clips' 
    } 
} 

感谢,

0

据我所知,有没有真正将数据传回从视图控制器的方式。我自己从来没有觉得有必要。您的控制器应该收集数据,然后将其传递给视图。如果您需要从数据库结果中获取更多数据,请先执行此操作,然后将其与原始数据一起传递给您的视图。

也许我不理解,虽然你的问题......

0

我不能完全肯定我理解你,但我认为你想从第一给所有的“表”让所有的“片段”数据库调用。也许以下可能的工作:

$this->db->from('clips'); 
$this->db->where_in('sheet_id', array_map(function($sheet) { return $sheet['id'] }, $data['get_cue_sheets']->result_array())); 
$data['get_clips'] = $this->db->get(); 
+0

有趣。不幸的是,当我实施您的解决方案时,我收到以下错误。解析错误:语法错误,意外的T_FUNCTION,期待')' – Tim 2010-06-15 02:20:24

+0

@Tim:上面只会在php 5.3或更高版本中工作。 – azatoth 2010-06-15 18:05:27

1

你应该做你的模型中两个表的一个连接,创建一个结果是你的看法槽控制器你以后会移动。

请记住不要在您的控制器中查询。

也许财产以后这样的:

function get_data($cue_sheets){ 
$this->db->select(clips.*); 
$this->db->from('clips'); 
$this->db->join('cue_sheets', 'clips.idcuesheet = cue_sheets.idcuesheet'); 
$this->db->where('cue_sheets.idcuesheet', $cue_sheets); 
$query = $this->db->get(); 
} 

或类似的东西。

然后你把它给控制器

$data['clips'] = $this->clips->get_data($cue_sheets); 

,最后到您的视图

foreach($clips as $clip){ 
echo $clip->clip_name; 
} 

希望它可以帮助

+0

感谢发布。我有点困惑,为什么你说不要把你的控制器查询。我知道MVC方法说所有数据库访问都是通过模型来完成的,但是,幸好codeigniter的模块化程度足以允许控制器内的数据库查询。这就是我一直在开发我的应用程序的其余部分,我很想知道为什么我应该避免这种做法。 谢谢 – Tim 2010-06-16 00:50:18

+0

我现在可以想到3个原因: 1)Simplicitym,有了这个控制器,你可以轻松读取和调试。 2)改变数据库的东西很容易3)可重复使用,你的代码是可重复使用的这种方式,如果你需要关于另一个控制器中的剪辑的信息,你不需要重新编写方法,你只需打个电话给你的模型。 – 2010-06-16 05:09:49