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方法吧;

一次还能忍;更可怕的是;然后随着业务的扩展;

每增加一张跟用户关联的表的时候;都得再含泪一次吧;

白俊遥博客
请先登陆后发表评论
  • 最新评论
  • 总共17条评论
白俊遥博客

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

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 回复

白俊遥博客
  • 云淡风晴 回复 zhttty:用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 回复

白俊遥博客
  • 云淡风晴 回复 ZheaJ:篇幅略微有点长;我把回复补充在了文章的最后边了;
  • 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 回复
白俊遥博客
  • 云淡风晴 回复 ZheaJ:哈哈;不客气;这里就来说下我的观点了;其实;只要不是那种搞阶级斗争或者是把程序猿当窃贼的公司;针对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 回复