2014-11-03 127 views
2

我想按年份和月份将杂志的问题分组在我的网站上。如何使用Codeigniter活动记录按年份和月份分组?

我在我的数据库中有年份和月份字段,我将用它来按年份和月份对数据进行分组。 (例如2013年4月)。什么我想 例(下令DESC):

2014 
    December 
    November 
    October 
    .... 

2013 
    December 
    November 
    October 
    .... 

型号:

public function get_all_mag($type){ 
    $this->db->where('type', $type); 
    $this->db->order_by("mag_year", "desc"); 
    $query = $this->db->get('magazine'); 
    return $query->result(); 
} 

控制器:

$data['magarchive'] = $this->Mdl_magazine->get_all_mag($id); 

查看:

<?php foreach ($magarchive as $archive): ?> 
    <div class="arhive_block"> 
     <span class="year"><?php echo $archive->mag_year; ?></span> 
     <div class="ar_nom"> 
      <a href="<?php echo base_url();?>magazine/issue/<?php echo $archive->id; ?>"> 
       <img src="<?php echo base_url();?>upload/<?php echo $archive->photo_footer; ?>" alt=""> 
      </a> 
      <a href="<?php echo base_url();?>magazine/issue/<?php echo $archive->id; ?>" class="month"><?php echo $archive->mag_month; ?></a> 
     </div> 
    </div> 
<?php endforeach; ?> 

现在,我越来越像t他:

2014 
December 
2014 
November 
... 
2013 
December 
2013 
November 
... 

我不是在笨的专家,我刚开始不是很久以前的事,所以请不要拍初学者。非常感谢。

回答

2

分组并显示,就像你描述可以肯定是有点混乱。首先,您需要将$this->db->group_by(array("mag_year", "mag_month"));添加到get_all_mag()方法。

public function get_all_mag($type) { 
    $this->db->where('type', $type); 
    $this->db->order_by("mag_year", "desc"); 
    $this->db->group_by(array("mag_year", "mag_month")); 
    $query = $this->db->get('magazine'); 
    return $query->result(); 
} 

这将完成为组的结果按年,然后按月,所以你会得到你期待中的数据。不幸的是,当你输出数据时你仍然会得到相同的结果,但是如果你更新get_all_mag()方法来返回一个对象数组,并且键是年份,它将使输出数据变得更容易。

public function get_all_mag($type) { 
    $this->db->where('type', $type); 
    $this->db->order_by("mag_year", "desc"); 
    $this->db->group_by(array("mag_year", "mag_month")); 
    $query = $this->db->get('magazine'); 

    $magarchive = array(); 

    if ($results = $query->result()) { 
     foreach ($results as $result) { 
      if (!isset($mag[$result->mag_year])) { 
       $magarchive[$result->mag_year] = array(); 
      } 

      $magarchive[$result->mag_year][] = $result; 
     } 
    } 

    return $magarchive; 
} 

这将返回一个对象数组,而不是单个对象。要以您想要的方式输出响应,您必须将您的视图更改为首次输出嵌套循环,然后在该年的每个月输出。

<?php foreach ($magarchive as $year => $months): ?> 
    <div class="arhive_block"> 
     <span class="year"><?php echo $year; ?></span> 
     <?php foreach ($months as $archive) : ?> 
      <div class="ar_nom"> 
       <a href="<?php echo base_url();?>magazine/issue/<?php echo $archive->id; ?>"> 
        <img src="<?php echo base_url();?>upload/<?php echo $archive->photo_footer; ?>" alt=""> 
       </a> 
       <a href="<?php echo base_url();?>magazine/issue/<?php echo $archive->id; ?>" class="month"><?php echo $archive->mag_month; ?></a> 
      </div> 
     <?php endforeach; ?> 
    </div> 
<?php endforeach; ?> 
+0

谢谢!但它只显示每年的第一个月的问题。这样:2014 - > January,2013-> January。每年的一个结果 – Refresh 2014-11-03 06:47:28

+0

更正了你的代码并使其正常工作!谢谢! – Refresh 2014-11-03 06:57:32

+0

很高兴能帮到你! – zachflower 2014-11-03 16:20:54

0

用途:

$this->db->group_by(array("year", "month"));

+0

如何将它们分组,同时取? – Refresh 2014-11-03 06:33:35

0

使用以下更新的代码。希望这将帮助 - 下面的代码

public function getArchiveDates() 
{ 
    $this->db->select('Year(posted_on) as year, MONTHNAME(posted_on) as month,post_id,post_title'); 
    $this->db->where('status', '1'); 
    $this->db->order_by("YEAR(posted_on)", "desc"); 
    $this->db->order_by("MONTH(posted_on)", "desc"); 
    $this->db->group_by(array("year", "month")); 
    $query = $this->db->get('tbl_mst_blog_posts'); 

    $magarchive = array(); 

    if ($results = $query->result()) { 
     foreach ($results as $result) { 

      $magarchive[$result->year][] = $result; 
     } 
    } 

    return $magarchive; 
} 

使用在您查看文件 - 鉴于

<?php foreach ($archive_dates as $year => $months): ?> 
       <div class="arhive_block"> 
        <span class="year"><?php echo $year; ?></span> 
        <?php foreach ($months as $archive) : ?> 
         <div class="ar_nom"> 

          <a href="<?php echo base_url(); ?>blog/<?php echo $archive->month; ?>" class="month"><?php echo $archive->month; ?></a> 
         </div> 
        <?php endforeach; ?> 
       </div> 
      <?php endforeach; ?>