thinkphp的model模型的设计经验总结

示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
关于模型;跟上篇文章thinkphp的目录结构设计经验总结写控制器一个道理;
为了尽量避免改动到框架;

首先我们是要有一个BaseModel.class.php作为我们的基础model;
我会在BaseModel中定义增删改的方法如下;

<?php
namespace Common\Model;
use Think\Model;
/**
 * 基础model
 */
class BaseModel extends Model{
    /**
     * 添加数据
     * @param    array    $data    数据 
     * @return   integer           新增数据的id 
     */
    public function addData($data){
        $id=$this->add($data);
        return $id;
    }
    
    /**
     * 修改数据
     * @param    array    $map    where语句数组形式 
     * @param    array    $data   修改的数据 
     * @return    boolean         操作是否成功
     */
    public function editData($map,$data){
        $result=$this->where($map)->save($data);
        return $result;
    }
    
    /**
     * 删除数据
     * @param    array    $map    where语句数组形式
     * @return   boolean          操作是否成功
     */
    public function deleteData($map){
        $result=$this->where($map)->delete();
        return $result;
    }

}

为每张表都建一个model;统一放在/Application/Common/Model/目录下即可;
然后所有的模型都继承BaseModel;
以后的增增删改如果没有特殊的需求;就可以直接调用addData、editData、deleteData;
如果有特殊需求的;就在某个表model中重新定义以上方法覆盖掉BaseModel中的addData、editData、deleteData;
这样的实际意义就等于在不改动框架的model的前提下扩展了model中的原本的add、save、delete等方法;
重点想说的是;所有的增删改;都统一用D函数而不要用M函数实例化model然后调用这3个方法;
这样做的好处是;当以后改表了;不用全世界的去找都那些地方调用了add、save、delete一一去改;
增删改都说了;那至于查;
1:强烈建议所有的where条件统一使用数组格式的;避免使用字符串格式的where;
2:竖着排版;

白俊遥博客
竖着排列;要明显优于横着排序;自行对比上下那种更便于阅读;高下立见;
白俊遥博客
3:固定按照 field、alias、join、where、order、limit 、select ;

     为什么要按照这个顺序呢?因为这跟我们正常拼sql的顺序一致;

SELECT
    u.id,
    s.*
FROM
    bjy_student AS s
JOIN bjy_users AS u ON s.uid = u.id
WHERE
    s. STATUS = 1
ORDER BY
    date
LIMIT 10;

4:join表的时候;起别名统一使用表的第一个字母;如果两张表的第一个字母一样;那就前两个字母;依次类推;
    这样规范了以后;将大大提高检查阅读代码的效率;
//*******************************回复 ZheaJ 童鞋评论的分割线****************************************
针对 ZheaJ 童鞋在评论中提出的问题;这里来做一下详细的解答;
为了更好理解;这里先假设项目
有Admin、User、Home三个模块;
有article、tag、config三张数据库表;
并分别创建了ArticleModel.class.php、TagModel.class.php、configModel.class.php三个model
我建议的是把这三个model统一都放在/Application/Common/Model/目录下;
没有分别在Admin、User、Home模块下分别创建三个model;那就是9个model文件;
原因是在不同模块下创建的model是不能方便的互相调用的;
比如说我Home模块和Admin模块及User模块 都有搜索article表中的文章这样的功能;
如果我每个模块下都有一个ArticleModel.class.php的话;
这个搜索文章的功能代码放那个模块下的ArticleModel.class.php中好呢?
这就要跨模块调用Model;或者复制3份搜索文章的代码了;
这样多出了2倍的model文件需要维护;这里只假设是3张表的;正常项目有多少表;想想都会疯的;

所以综上所述;如果项目没有庞大到一定程度;
所有model统一放在/Application/Common/Model/是比较靠谱的;

//*******************************回复北柒星童鞋评论的分割线****************************************
不只是改表;还有很多场景下;

我们先来假设一个不是很恰当但是能说明问题的场景吧;
比如说我们有文章表、评论表等是跟用户表关联的;
当删除用户的时候;我们需要同时删除其下的文章和评论;

针对用户表如果我们没有一个可以控制到所有删除的deleteData方法的话;
那就含着泪满世界的去找都在那些地方M了user表调用了delete方法吧;
一次还能忍;更可怕的是;然后随着业务的扩展;
每增加一张跟用户关联的表的时候;都得再含泪一次吧;

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共42条评论
白俊遥博客

zhou :俊瑶兄~请教一个问题。文章最后你说的,“当删除用户的时候;我们需要同时删除其下的文章和评论”,这里的意思是说在deleteData方法里增加判断如果模型是User的时候,再增加文章和评论表的删除操作嘛?

2018-02-01 11:35:40 回复

白俊遥博客

qifeng001 :楼主,已经在别的文章底下扫码支付申请进群求教了。今早通过一下、你这种设计模式没有看明白。设计一下  BaseModel  类,数据库必须存在base这张表吗?

2017-10-23 22:56:11 回复

白俊遥博客 白俊遥博客

云淡风晴 :数据库不需要存在base表;BaseModel 是一个基类;是为了让别的Model继承的;就像是所有的控制器都继承Controller;但是Controller并没有路由无法访问;

2017-10-25 00:06:05 回复

白俊遥博客

匣与桔 :写的非常棒,自己刚使用tp一个月,现在能看懂博主说的,感觉已经很满意了。希望博主更一个第三方qq微博登录的

2017-09-26 23:52:21 回复

白俊遥博客 白俊遥博客

云淡风晴 :QQ和微博登录都是有的;

2017-10-25 00:06:27 回复

白俊遥博客

lnx :博主 我下载了你这个博客源码  qq登录评论怎么登录不了  qq的APP ID  APP KEY也单添加了 请解答一下

2017-08-08 23:04:59 回复

白俊遥博客 白俊遥博客

云淡风晴 :登录不了要看腾讯返回的错误代码;

2017-10-25 00:06:49 回复

白俊遥博客

Smile尐磊 :博主  你好   方便加个Q吗   有问题 请教下  251656006

2017-03-30 17:14:22 回复

白俊遥博客

Rue :博主 ,方便加Q请教吗

2017-03-05 18:10:31 回复

白俊遥博客

吴伟祥 :先把你的所有文章过一遍!有点上瘾!回头再多通读几遍!

2017-01-06 16:58:50 回复

白俊遥博客

吴伟祥 :好

2017-01-06 16:58:20 回复

白俊遥博客

工作号 :截图的代码 怎么根据主键id?  结构和thinkcmf有点像

2016-12-23 11:56:16 回复

白俊遥博客 白俊遥博客

云淡风晴 :截图主要是展示两种代码风格优劣随手打的;疏忽了;多谢提醒;已换图;恩;研究参考过onethink和thinkcmf;然后结合自己的实际开发经验总结了;

2016-12-24 11:41:25 回复

白俊遥博客

江湖郎中 :博主 可以请问您  在写这个简约博客程序的时候 的简要步骤么?

2016-11-14 18:19:27 回复

白俊遥博客 白俊遥博客

云淡风晴 :后台分类、标签、文章;然后前台页面;剩下的就是细节了;

2016-11-15 23:43:04 回复

白俊遥博客

蓝天白云 :博主, 用D方法直接实例化Application/Common里面的Model文件, D方法会自动找到这个数据库模型吗, 官方文档上说的是自动实例化当前模块, 比如Home下的Model文件.  这样直接写也可以找到吗; 比如我Home/UserController里面的login方法, 操作user表, 直接用D('user')就可以吗

2016-11-14 16:29:03 回复

白俊遥博客 白俊遥博客

云淡风晴 :是的;D函数会自动实例化Common/Model或者 模块/Model 目录下的模型;

2016-11-15 23:42:28 回复

白俊遥博客

蓝天白云 :好的~ 谢谢啦

2016-11-16 11:02:48 回复

白俊遥博客

丑小鸭_2012 :324

2016-11-07 12:33:39 回复

白俊遥博客

北柒星 :“这样做的好处是;当以后改表了;不用全世界的去找......”以后改表的发生概率会是多少呢?我觉得这样做是不是有些过度设计了。

2016-10-11 18:12:32 回复

白俊遥博客 白俊遥博客

云淡风晴 :我论述的有点啰嗦;补充到文章后边了;

2016-10-11 22:04:03 回复

白俊遥博客

zhttty :加载

2016-09-08 11:15:03 回复

白俊遥博客

zhttty :博主 为什么在 Controller 使用model 的方法 不需要再见model类? 你在哪里设置了? 

2016-09-08 11:14:50 回复

白俊遥博客 白俊遥博客

云淡风晴 :用D函数或者M函数;

2016-09-08 21:12:34 回复

白俊遥博客

阿西里西 :得顶啊

2016-09-08 10:49:23 回复

白俊遥博客

々飛♂ :php自学者,希望能多多请教博主。谢谢

2016-08-23 21:59:39 回复

白俊遥博客 白俊遥博客

云淡风晴 :客气;互相学习了;

2016-08-24 20:49:06 回复

白俊遥博客

々飛♂ :能否加个企鹅?希望能多多请教,1833413570.谢谢

2016-09-07 11:10:45 回复

白俊遥博客

Fantastic :加我加我哈哈252134756

2016-08-15 11:09:26 回复

白俊遥博客

じ追※忆づ :很不错下载体验中

2016-08-07 16:22:03 回复

白俊遥博客

じ追※忆づ :请先登陆后发表评论

2016-08-07 16:21:24 回复

白俊遥博客

:博主能留下QQ吗,我只有一年经验PHP,有一些问题希望能请教你,如果不方便的话,可以加我QQ386819091 ,谢谢您!

2016-08-05 14:47:29 回复

白俊遥博客 白俊遥博客

云淡风晴 :不好意思;看到的有点晚;加你了;

2016-08-07 21:10:51 回复

白俊遥博客

大海 :能加下我吗?现在用你的bjyadmin做开发,估计一大堆问题想问你,麻烦加下我qq1262638533

2016-09-28 19:09:00 回复

白俊遥博客

Websky 白俊遥博客收益多多,感谢分享

2016-07-27 22:30:00 回复

白俊遥博客

ZheaJ 白俊遥博客首先哈,这篇文章写得非常棒,但是我有一个小疑惑白俊遥博客“为每张表都建一个model;统一放在/Application/Common/Model/目录下即可;”为什么都统一放在公共文件里哈?我以为只要BaseModel放在/Application/Common/Model/目录下,然后在Admin模块下的Model文件夹里放关于后台表的Model去继承BaseModel。噫~白俊遥博客

2016-06-23 22:09:47 回复

白俊遥博客 白俊遥博客

云淡风晴 :篇幅略微有点长;我把回复补充在了文章的最后边了;

2016-06-24 10:16:18 回复

白俊遥博客

ZheaJ :首先,你写了这么多,真的表示感谢,辛苦啦,我懂你意思了,你说的article、tag、config这三个表都是可能在Admin、User、Home这三个模块里调用的,这个我理解哈,我问这个问题前我以为你说的这句话“为每张表都建一个model;统一放在/Application/Common/Model/目录下即可;”是代表可能只有Admin模块用到的Model也要放在/Application/Common/Model/目录下...如果只有Admin模块用到那么我只要放在Admin模块下的Model文件夹里然后去继承BaseModel就OK咯,诶,我有点啰嗦白俊遥博客

2016-06-24 10:23:17 回复

白俊遥博客 白俊遥博客

云淡风晴 :哈哈;不客气;这里就来说下我的观点了;其实;只要不是那种搞阶级斗争或者是把程序猿当窃贼的公司;针对model来说并不需要有权限的概念的;不必像对待用户那样;分为Home普通展示和Admin管理后台;因此我并不是依据功能来划分的;我是依据表来划分的;无论是Admin模块还是Home模块对artilce的操作;终究是对表的操作;既然是对表的操作;那就把所有操作的方法都放在对应的/Application/Common/Model/ArticleModel.class.php中;方便任何模块都能调用其中 的方法就是比较合理的;当然;config.php我认为每个模块下都有一个是可以理解的;虽然并不一定每个模块下都需要有特殊的配置;但是像function.php和**Model.class.php也在每个模块下都建一个;我还没有找到适用的场景;

2016-06-24 10:55:04 回复

白俊遥博客

大男子汉 :这有点瑕疵

2016-04-16 11:58:35 回复

白俊遥博客

大男子汉

2016-04-16 11:58:22 回复

白俊遥博客

Y 白俊遥博客小白受教了

2016-03-31 17:24:14 回复