将control层复杂sql转到model层上

#1 yaoxh

speed在 遇到复杂的sql,我们得使用findsql或runsql来实现数据操作,这些操作在控制层里进行,

个人认为这些操作做好在model里统一进行为好,这样control里就比较干净清晰了它做一些页面控制和参数获取就行,model也专用来做数据层操作。

其实也很简单,可将findsql重新在model里封装一个方法就可以了,我这里用 myFindSql来封装它


封装后的model:
  class guestbook extends spModel
{
  var $pk = "id"; //
  var $table = "guestbook"; //
function myFindSql($id){

return $this->findSql("select * from guestbook where id  = 10 ");
}
}

在control里使用:

function indexOne(){  
   $guestbook = spClass("guestbook");
   $id = 10 ;

   //$this->results  =  $guestbook->findSql("select * from guestbook where id =  $id ");   // 原来直接使用findsql。
   $this->results  =   $guestbook->myFindSql($id);  // 调用model的方法。
   $this->display("green/index.html");
  }

2011-12-26 21:30:37

#2 coolhpy

MVC不是本来就应该这么操作的么

2011-12-27 08:39:38

#3 jake

从MVC的理解上来说,楼主说的很好。

不过经过多年的实践,我个人觉得,类似spModel的findSql,findAll等等,只要是一行代码实现的,都可以放C层,毕竟spModel也算是一个M层,它的方法也是“封装”的。

把C层SQL转移到M层,最主要的是两点:
1. 数据操作中,有别的操作,是组合在一起的。比如说findSql之后,我们要重新循环数组再做处理,那么我们就应该把“findSql+处理”封装起来,让C层可以一行调用。
2. 如果这个操作有很多地方会用到,而且用的时候,参数值各有不同。比如说上面的SQL语句只取10条,如果有另一个C层需要同样的操作,但是可能是取20条。那么就封装起来,各个C层根据自己需要决定取得条数。

2011-12-27 08:58:40

#4 yaoxh

有道理,   
   还有一个service 业务层,  业务层放在哪儿处理 ,目前应该就是在M层了,当然对于简单的cuid业务是足够了的。
  但如有复杂业务逻辑处理时,似乎放在control里为好,通过control引入service类进行逻辑处理等。当然还得考虑到service里又要使用spmodel。
  如何设计,还希望给位给出合理建议。

2011-12-29 09:06:45

#5 jake

注重交互的service,你可以把它看作一套比较多controller的controller集。

注重数据处理的service,你可以看做一套model集。

如果两边都有侧重,那么你可以把它们分开成为上面两者。

2011-12-29 09:56:21