php 使用 Code Igniter 控制器和视图创建 foreach 循环

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3041616/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 08:30:22  来源:igfitidea点击:

Creating foreach loops using Code Igniter controller and view

phpmodel-view-controllercodeignitercontrollerforeach

提问by Tim

This is a situation I have found myself in a few times and I just want clear it up once and for all.

这是我遇到过几次的情况,我只想一劳永逸地解决它。

Best just to show you what I need to do in some example code.

最好只是在一些示例代码中向您展示我需要做什么。

My Controller

我的控制器

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);

}

My View

我的看法

<?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 } ?>

So basically I am trying to display a number of sheets and then within each of those sheets the clips that belong to that sheet.

所以基本上我试图显示一些工作表,然后在每个工作表中显示属于该工作表的剪辑。

I hope this makes sense to someone out there.

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

Thanks,

谢谢,

Tim

蒂姆

回答by Tim

A user on the Code Igniter Forums came up with the solution below. The original thread is here.

Code Igniter 论坛上的一位用户提出了以下解决方案。原始线程在这里

It's not efficient to look up the clips for every sheet separately. Use a JOIN query to get both lists at the same time.

单独查找每张纸的剪辑效率不高。使用 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;
}

Now in your view you can loop through the sheets, and within that, loop through the clips:

现在在您的视图中,您可以循环浏览工作表,并在其中循环浏览剪辑:

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

Thanks again,

再次感谢,

Tim

蒂姆

回答by Gerardo Jaramillo

You should do a join in your model for both tables, and create one result which you will move later to your view trough the controller.

您应该对两个表的模型进行连接,并创建一个结果,稍后您将通过控制器将其移动到您的视图中。

Remember not to put queries in your controller.

记住不要在控制器中放置查询。

maybe somthing like this:

也许是这样的:

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();
}

Or something similar.

或者类似的东西。

Then you bring it to the controller

然后你把它带到控制器

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

and finally to your view

最后在你看来

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

Hope it helps

希望能帮助到你

回答by Matthew

As far as I know, there's not really a way to pass data back to the controller from the view. I myself have not ever felt the need to. Your controller should be gathering the data and then passing it to the view. If you have additional data to get from your database results, do that first and then pass it to your view along with the original data.

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

Maybe I'm not understanding your question though...

也许我不明白你的问题虽然...

回答by azatoth

I'm not fully certain I understand you, but I think you want to get all "clips" from all "sheets" given by the first db call. Perhaps following might work:

我不完全确定我理解你,但我认为你想从第一个 db 调用给出的所有“工作表”中获取所有“剪辑”。也许以下可能有效:

$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();