专注于WEB技术的IT博客

关于thinkphp优化的一点总结

时间:2012-12-13分类: Thinkphp浏览:7126
分享到:

    前段时间为了写一个博客,特地使用thinkphp框架写了一个博客程序wblog,之后对其作了优化,现在感觉到了thinkphp框架的强大之处。

     

    前期的wblog有好多thinkphp的特性没有用上,走的是开发原生态的php系统的思路。thinkphp是一个基于MVC模式的框架,一般来说业务是放在M(模型)上处理的,C(控制器)只负责组织调用M处理好的功能函数使其返回给V(视图)。可是前期的WBLOG中的C似乎肩负着业务处理和组织调控两项任务,这有违MVC的理念了。如把所有的函数都放在公共控制器CommonAction.class.php上,其余的控制器都继承公共控制器,由于函数太多,所以CommonAction.class.php显得有点雍肿,而模型Model却空闲着,什么也不做。

     

    这次对WBlog作了优化,每个表对应着一个Model,负责处理与之相关的逻辑业务,控制器负责组织调控Model处理好的业务。我在前面的"怎样彻底删除thinkphp3.1案例blog的标签?"写过一个删除标签的方法,当初这个删除主法是放在控制器上的,现在我们把它放在模型上,对比一下。

     

    下面这个删除函数是写在公共控制器CommonAction.class.php上的

     

public function deltag($recordId){         
         
      $condition['recordId'] = $recordId;//获取日记的ID   
               
     $tagged=M('Tagged');   
     $taggedlist= $tagged->where($condition)->select();//这里用select而不用find,因为一篇日记可能有多个标签   
                 
   $taggedids=array();//声明一个数组,用来装think_tagged表的ID   
                 
    $tagIds=array();//声明一个数组,用来装think_tag表的ID   
                 
    foreach ($taggedlist as $key => $value) {   
                 
   $tagIds[]=$value['tagId'];//获取think_tag表的ID   
                        
   $taggedids[]=$value['id'];//获取think_tagged表的ID   
               }   
 //考虑到一篇日记可能有多个标签,所以这里对$tagIds作一下遍历   
  foreach ($tagIds as $tagIdk => $tagIdv) {   
                 
   $tagId=$tagIdv;     
                       
   $tag=D('Tag');   
                        
   $tagvo=$tag->where('id='.$tagId)->find();//获取每个$tagId对应的一条记录   
                
  $count=intval($tagvo['count']);//获取标签的数量   
                
  if($count==1){//如果$count==1,说明这个标签仅有这篇日记所有,删掉。   
                        
  $tag->where('id='.$tagId)->delete();   
                         
  }elseif($count > 1){//$count > 1,说明这个标签为多篇日记所有,不能删除,所以减1。   
                      
  $tag->where('id='.$tagId)->setDec('count',1);//setDec使$count减1,注意thinkphp3.1的使用方法。   
                     
   }   
 }   
 //下面是删除日记存在think_tagged表里的相关数据   
   foreach ($taggedids as $taggedid_k => $taggedid_v) {   
                   
    $tagged->where('id='.$taggedid_v)->delete();   
                        
    }   
                 
                 
 }

    现在把上面的deltag方法写在TaggedModel.class.php模型上

     

public function deltag($recordId) {   
        
            //删除tag表相关标签信息  
            $tagIds = $this->where(array('recordId'=>$recordId))->getField('tagId',true);//使用getField查询语句直接返回$tagId数组  
            if ($tagIds !== false) {  
            $tag = D('Tag');  
            foreach ($tagIds as $tagIdk => $tagIdv) {  
                $tagId = $tagIdv;  
                $count=$tag->where(array('id'=>$tagId))->getField('count');//直接返回$count  
                    
                if ($count == 1) {  
                    $tag->where(array('id'=>$tagId))->delete();  
                                        
                }elseif ($count > 1) {  
    
                    $tag->where(array('id'=>$tagId))->setDec('count', 1);  
    
                }  
              }  
            }  
            //删除tagged表相关标签信息  
            $taggedids= $this->where(array('recordId'=>$recordId))->getField('id',true);//直接返回$taggedid数组  
            if ($taggedids !== false){  
            foreach ($taggedids as $taggedid_k => $taggedid_v) {  
                $this->where(array('id' => $taggedid_v , 'recordId' =>$recordId))->delete();  
            }  
          }  
    
    }

    对比一下,就知道下面的deltag方法更加简洁,其特点就是把逻辑业务处理交给了Model,避免了控制器的彭涨,其次就是使用了thinkphp封装在模型上的一个getField查询语句

     

     

   

猜你喜欢
ThinkPHP自定义模板标签详解
wblog3.1.3_2升级说明
ThinkPHP普通分组下Widget的使用
如何让ThinkPHP的模板引擎达到最佳效率
WBlog博客前台独立栏目页的实现方法
WB3.1.2_2版本使用说明
封装ThinkPHP的一个文件上传方法
ThinkPHP3.1.2整合UCenter详解(四)
ThinkPHP3.1.2整合UCenter详解(三)
ThinkPHP3.1.2整合UCenter详解(二)
标签 : thinkphp
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/59.html,谢谢。
  • 评论
  • 赞助本站