Php 使用CodeIgniter控制器和视图创建foreach循环

Php 使用CodeIgniter控制器和视图创建foreach循环,php,model-view-controller,codeigniter,controller,foreach,Php,Model View Controller,Codeigniter,Controller,Foreach,这是一个我已经发现自己在几次的情况,我只想把它一劳永逸 最好只是在一些示例代码中向您展示我需要做什么 我的控制器 我的看法 所以基本上,我试图显示一系列的表单,然后在每个表单中显示属于该表单的剪辑 我希望这对外面的人来说是有意义的 谢谢 Tim据我所知,实际上没有办法从视图将数据传递回控制器。我自己从来没有觉得有必要这样做。控制器应该收集数据,然后将其传递给视图。如果要从数据库结果中获取其他数据,请先执行此操作,然后将其与原始数据一起传递给视图 也许我不理解你的问题…据我所知,没有一种方法可以从

这是一个我已经发现自己在几次的情况,我只想把它一劳永逸

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

我的控制器

我的看法

所以基本上,我试图显示一系列的表单,然后在每个表单中显示属于该表单的剪辑

我希望这对外面的人来说是有意义的

谢谢


Tim

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


也许我不理解你的问题…

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


也许我不理解你的问题…

我不能完全肯定我理解你,但我想你想从第一次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();

我不能完全确定我是否理解您,但我认为您希望从第一次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();

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

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

也许是这样的:

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

希望它有帮助

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

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

也许是这样的:

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

希望它有帮助

代码点火器论坛上的一位用户提出了以下解决方案。原始线程是

单独查找每张图纸的剪辑是没有效率的。使用联接查询可同时获取两个列表

// 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'
  }
} 
再次感谢


Tim

代码点火器论坛上的一位用户提出了以下解决方案。原始线程是

单独查找每张图纸的剪辑是没有效率的。使用联接查询可同时获取两个列表

// 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'
  }
} 
再次感谢


蒂姆很有趣。不幸的是,在实现您的解决方案时,我遇到了以下错误。分析错误:语法错误,意外的T_函数,期望有趣。不幸的是,在实现您的解决方案时,我遇到了以下错误。解析错误:语法错误,意外的T_函数,希望感谢您的发布。我有点困惑,为什么你说不要在你的控制器中放置查询。我知道MVC方法说所有的数据库访问都可以通过模型来完成,不过幸好codeigniter的模块化程度足以允许从控制器内部进行数据库查询。这就是我开发应用程序其余部分的方式,我很想知道为什么我应该避免这种做法。ThanksI现在可以想到三个原因:1简单,有了它,您的控制器将更容易阅读和调试。2更改数据库内容将非常容易3可重用,您的代码通过这种方式可重用性很强,如果您需要关于另一个控制器中的剪辑的信息,您不需要重新编写方法,只需调用您的模型即可。感谢您的发布。我有点困惑,为什么你说不要在你的控制器中放置查询。我知道MVC方法说所有的数据库访问都可以通过模型来完成,不过幸好codeigniter的模块化程度足以允许从控制器内部进行数据库查询。这就是我开发应用程序其余部分的方式,我很想知道为什么我应该避免这种做法。ThanksI现在可以想到三个原因:1简单,有了它,您的控制器将更容易阅读和调试。2更改数据库内容将非常容易3可重用,您的代码可以通过这种方式进行重用,如果您需要有关另一个控制器中的剪辑的信息,您不需要重新编写该方法,只需调用您的模型即可。