foreach循环中的Codeigniter查询

时间:2013-11-18 14:19:19

标签: codeigniter query-optimization

我正在尝试为区域明智的消息阻止编写MVC。就像用户检查他们想要获取消息的区域复选框一样,同时取消选中他们不希望获得消息的区域复选框。用户的此复选框选项的详细信息存储在“geo”表中,其中包含user_id和区域代码,如in_p1,in_p2,... upto in_p17。例如如果用户希望来自该特定区域的消息,则db中的in_p1字段应为1,否则in_p1应为0以避免来自该区域的消息,区域in_p2 tp in_p17中的逻辑相同。    在个别表中,“in_pays”是1到17之间的区域ID。我当前的MVC代码在本地主机上工作正常,但在实际站点上,因为db已经为每个区域提供了超过5百万的用户。 所以你们可以帮助我避免foreach循环中的查询,以便我可以避免数百万次查询的运行吗?我的MVC代码是

我的控制器

$geo_arr=$this->settingmodel->get_geotable();
 //echo '<br><pre>'; print_r($geo_arr); echo '</pre>';
foreach($geo_arr as $geo)
{
   for($count=1;$count<18;$count++)
   {    
      $in_p='in_p'.$count; //in_p1,in_p2..in_p17 is column name in `geo` table
      if($geo->$in_p==1)   // e.g. if in_p1=1 then messages from area code 1 is allowed
      { 
        $this->settingmodel->unblock_messages($in_pays=$count);
      }
      else                //e.g. if in_p1!=1 then messages from area code 1 is not allowed
      {
    $this->settingmodel->block_message($in_pays=$count);
      }
   }
}

我的模特

function unblock_messages($in_pays)
{
   $login_user=$this->session->userdata('in_pseudo');
   $this->db->select('in_pseudo');
   $this->db->from('individu');
   $this->db->where('in_pays',$in_pays);
   $query=$this->db->get();

   $result=$query->result();

   foreach($result as $res)
   {
      $me_from=$res->in_pseudo;
      $arr=array('ME_VALID'=>'NULL');
      $this->db->where('ME_FROM',$me_from);
      $this->db->where('ME_TO',$login_user);
      $this->db->update('message',$arr);

   }
}
function block_message($in_pays)
{

    $login_user=$this->session->userdata('in_pseudo');
    $this->db->select('in_pseudo');
    $this->db->from('individu');
    $this->db->where('in_pays',$in_pays);
    $query=$this->db->get();
    $result=$query->result();

    foreach($result as $res)
    {
         $me_from=$res->in_pseudo;
         $arr=array('ME_VALID'=>'X');
         $this->db->where('ME_FROM',$me_from);
         $this->db->where('ME_TO',$login_user);
         $this->db->update('message',$arr);

    }
}

function get_geotable()
{
    $in_num=$this->session->userdata('in_num');
           $this->db->select('in_p1,in_p2,in_p3,in_p4,in_p5,in_p6,in_p7,in_p8,in_p9,in_p10,in_p11,in_p12,in_p13,in_p14,in_p15,in_p16,in_p17');

$this->db->from('geo');
    $this->db->where('in_num',$in_num);
    $query=$this->db->get();
    $result=$query->result();
    return $result;

}

0 个答案:

没有答案