thinkphp 几个问题求助?

问题1:虽然说明上说model是处理数据库和表单相关的,但是具体是干什么的呢?我发觉一般的表单过滤、验证啥的,我在控制器中就可以完成了呀,根本就用不上表单,各位能举个实例吗?证明一下只有model能做到的,或者说做的比控制器中处理的好的,求解;

问题2:我在写后台的时候,不是涉及到删除单个数据嘛,比如删除单篇文章,单个作者,单个分类,我发现这样的基本都是根据id来删数据的,于是就想到了是不是可以把这个操作写成一个公共函数方法呢?就是放在common.php中来调用,而不是写到控制器中,请问这样写好不好,大侠们一般是怎么做的呢?
就是以上两个问题了,望大牛指教,谢谢了
最新回答
菊部地区有血

2026-10-29 23:15:05

一,你的问题好多呀,才给五分。

 

 

二,回答问题1。

概念上你已经清楚了,可能是还没有具体了解。

我给你举点例子吧。然给你深入理解下Model的应用-----对于良好封装的模型,他的作用不仅仅是简单的过滤,验证啥啥的。

 

好了,我们先来假设一个应用,用户登录吧。

那么,你首先应该有一个数据表吧,比如就是my_user。然后。一般的,你要实现这样一个操作。

用户登录,用户退出,用户注册。然后,重点来了,获取多个用户的详细资料(还有其他的,比如获取用户好友啊什么的,这里就不深入了讨论了)。那么,你的Action,可能会这样写。

假定这个Action是UserAction---->文件名UserAction.class.php

//登录 
public function login(){
//操作代码暂时省略  
}
//登出 
public function loginout(){
//省略  
}
//获取详细资料 
public function  getPorfiles($ids){  
//然后我想说的是这里。
//在这个UserAction里,你是不是需要查询一次数据库。来获取用户的详情。? 

假定,我们这个使用的查询语句



$sql_manytimes="select * from my_user .....";  
     }

然后,你的应用里,假设还有另外一个操作,比如是博客Blog吧。即BlogAction

//读取文章 
public function read(){ 
//在显示文章的时候 
//在这里。你需要获取多个评论用户的详细信息。(普通通的连接运算已经不“划算”的情况)//这是你是不是有需要进行UserAction中的getProfiles中的,同样的,数据库查询了?
即:$sql_manytimes  
 }

然后,当你的项目很大的时候。。如果继续这样下去

你是不是会多次重复的$sql_manytimes。。。

然后当,你想更改这个$sql_manytimes是不是需要到处去修改。。?

 

 

问题出来了,那么作用就出来了。这个时候,就有了Model了。

 

 

你可以这样。定义一个

class UserModel extends Model{

public function getPorfiles($ids){
这里来处理获取用户信息的查询。  
}  
}

这样。你每次在Action调用的时候。

就都可以使用

D('User')->getProfiles($ids);了。

 

 

小结:模型的优点体现在封装、复用、可移植上面。如果你项目小,是可以把东西Action里面。

项目大的时候,model的作用就提现出来了。

我给你举的例子还不是很好,篇幅有限,不多说了。想聊发私信。

 

 

 

三,问题2.

你的思路很好,也看得出你是比较爱钻研的。只是对OOP的继承,没有理解的很好。我同样给你举个例子。

 

 

你定义一个BaseAction  在里面顶一个删除操作。

比如

 

 

 

class BaseAction extends Action{

public $m;
public function delete(){
$map[$this->m->getPk()]=array('eq',$_GET['id']); //数据过滤我就不做了
//$this->m->getPk();获取模型的主键。$map类似等效于
//$map['id']=array('eq',$_GET['id']);
$this->m->where($map)->delete(); 

dump($this->m->getLastSql());//打印出查询语句,方便后面测试
 }   

//类似的写法可以有ADD,EDIT,等   
}


  
//然后你的另外的操作。比如是BlogAction则继承BaseAction即可
class BlogActon extends BaseAction{

public function _initialize(){
$this->m=D('Blog');//z这个$this->m。就是Base中的那个$m;  
}   
}  

现在。你去尝试访问地址

..../Blog/delete/id/1111   
试试。。【它会执行,删除】   。然后打印出
...delete from my_blog where id=1111    ...