thinkphp 命名范围
在应用开发过程中,使用最多的操作还是数据查询操作,凭借ThinkPHP的连贯操作的特性,可以使得查询操作变得更优雅和清晰,命名范围功能则是给模型操作定义了一系列的封装,让你更方便的操作数据。
命名范围功能的优势在于可以一次定义多次调用,并且在项目中也能起到分工配合的规范,避免开发人员在写CURD操作的时候出现问题,项目经理只需要合理的规划命名范围即可。
定义属性
要使用命名范围功能,主要涉及到模型类的_scope属性定义和scope连贯操作方法的使用。
我们首先定义_scope属性:
namespace Home\Model;use Think\Model;class NewsModel extends Model {protected $_scope = array(// 命名范围normal'normal'=>array('where'=>array('status'=>1),),// 命名范围latest'latest'=>array('order'=>'create_time DESC','limit'=>10,),);}
_scope属性是一个数组,每个数组项表示定义一个命名范围,命名范围的定义格式为:
'命名范围标识'=>array('属性1'=>'值1','属性2'=>'值2',...)
命名范围标识:可以是任意的字符串,用于标识当前定义的命名范围名称。
命名范围支持的属性包括:
| 属性 | 描述 |
|---|---|
| where | 查询条件 |
| field | 查询字段 |
| order | 结果排序 |
| table | 查询表名 |
| limit | 结果限制 |
| page | 结果分页 |
| having | having查询 |
| group | group查询 |
| lock | 查询锁定 |
| distinct | 唯一查询 |
| cache | 查询缓存 |
每个命名范围的定义可以包括这些属性中一个或者多个。
方法调用
属性定义完成后,接下来就是使用scope方法进行命名范围的调用了,每调用一个命名范围,就相当于执行了命名范围中定义的相关操作选项对应的连贯操作方法。
调用某个命名范围
最简单的调用方式就直接调用某个命名范围,例如:
$Model = D('News'); // 这里必须使用D方法 因为命名范围在模型里面定义$Model->scope('normal')->select();$Model->scope('latest')->select();
生成的SQL语句分别是:
SELECT * FROM think_news WHERE status=1SELECT * FROM think_news ORDER BY create_time DESC LIMIT 10
调用多个命名范围
也可以支持同时调用多个命名范围定义,例如:
$Model->scope('normal')->scope('latest')->select();
或者简化为:
$Model->scope('normal,latest')->select();
生成的SQL都是:
SELECT * FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 10
如果两个命名范围的定义存在冲突,则后面调用的命名范围定义会覆盖前面的相同属性的定义。
如果调用的命名范围标识不存在,则会忽略该命名范围,例如:
$Model->scope('normal,new')->select();
上面的命名范围中new是不存在的,因此只有normal命名范围生效,生成的SQL语句是:
SELECT * FROM think_news WHERE status=1
默认命名范围
系统支持默认命名范围功能,如果你定义了一个default命名范围,例如:
protected $_scope = array(// 默认的命名范围'default'=>array('where'=>array('status'=>1),'limit'=>10,),);
那么调用default命名范围可以直接使用:
$Model->scope()->select();
而无需再传入命名范围标识名
$Model->scope('default')->select();
虽然这两种方式是等效的。
命名范围调整
如果你需要在normal命名范围的基础上增加额外的调整,可以使用:
$Model->scope('normal',array('limit'=>5))->select();
生成的SQL语句是:
SELECT * FROM think_news WHERE status=1 LIMIT 5
当然,也可以在两个命名范围的基础上进行调整,例如:
$Model->scope('normal,latest',array('limit'=>5))->select();
生成的SQL是:
SELECT * FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 5
自定义命名范围
又或者,干脆不用任何现有的命名范围,我直接传入一个命名范围:
$Model->scope(array('field'=>'id,title','limit'=>5,'where'=>'status=1','order'=>'create_time DESC'))->select();
这样,生成的SQL变成:
SELECT id,title FROM think_news WHERE status=1 ORDER BY create_time DESC LIMIT 5
与连贯操作混合使用
命名范围一样可以和之前的连贯操作混合使用,例如定义了命名范围_scope属性:
protected $_scope = array('normal'=>array('where'=>array('status'=>1),'field'=>'id,title','limit'=>10,),);
然后在使用的时候,可以这样调用:
$Model->scope('normal')->limit(8)->order('id desc')->select();
这样,生成的SQL变成:
SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 8
如果定义的命名范围和连贯操作的属性有冲突,则后面调用的会覆盖前面的。
如果是这样调用:
$Model->limit(8)->scope('normal')->order('id desc')->select();
生成的SQL则是:
SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 10
动态调用
除了采用scope方法调用命名范围外,我们还支持直接调用命名范围名称的方式来动态调用,例如:
$Model->scope('normal',array('limit'=>5))->select();
查询操作也可以采用:
$Model->normal(array('limit'=>5))->select();
的方式调用。 normal(array('limit'=>5))表示调用normal命名范围,并且传入额外的array('limit'=>5)参数。
由于采用的是__call魔术方法机制,因此这样调用的前提是你定义的命名范围名称没有和现有操作方法冲突。
thinkphp 命名范围的更多相关文章
- Thinkphp命名规范
1.类文件都是以.class.php为后缀(这里是指的ThinkPHP内部使用的类库文件,不代表外部加载的类库文件),使用驼峰法命名,并且首字母大写,例如 DbMysql.class.php: 2.类 ...
- thinkphp 命名规范
目录和文件命名 目录和文件名采用 小写+下划线,并且以小写字母开头: 类库.函数文件统一以.php为后缀: 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致(包括大小写): 类名和 ...
- ThinkPHP import 类库导入 include PHP文件
ThinkPHP 模拟了 Java 的类库导入机制,统一采用 import 方法进行类文件的加载.import 方法是 ThinkPHP 内建的类库和文件导入方法,提供了方便和灵活的文件导入机制,完全 ...
- 从" ThinkPHP 开发规范 "看 PHP 的命名规范和开发建议
稍稍水一篇博客,摘抄自Think PHP 的开发规范,很有引导性,我们可以将这些规范实践到原生 PHP 中. 命名规范 使用ThinkPHP开发的过程中应该尽量遵循下列命名规范: 类文件都是以.cla ...
- ThinkPHP 模型(Model)命名规范
一个小问题搞了好久:如果数据库的表名中有下划线,那么在用thinkphp做自动完成时注意Model类的命名要变成驼峰法,文件名和类名都要变.( 另外注意:只有使用create方法创建数据时才能调用到自 ...
- 这次一定理清晰ThinkPHP之中的模型、数据库之间命名规范
ServiceSiteModel.class.php 这个模型操控的数据库是service_site表: <?php namespace Admin\Model; use Think\Model ...
- thinkphp学习笔记1—目录结构和命名规则
原文:thinkphp学习笔记1-目录结构和命名规则 最近开始学习thinkphp,在下不才,很多的问题看不明白所以想拿出来,恕我大胆发在首页上,希望看到的人能为我答疑解惑,这样大家有个互动,学起来快 ...
- ThinkPHP中的模型命名
当我们创建一个UserModel类的时候,其实已经遵循了系统的约定.ThinkPHP要求数据库的表名和模型类的命名遵循一定的规范,首先数据库的表名和字段全部采用小写形式,模型类的命名规则是除去表前缀的 ...
- THINKPHP源码学习--------文件上传类
TP图片上传类的理解 在做自己项目上传图片的时候一直都有用到TP的上传图片类,所以要进入源码探索一下. 文件目录:./THinkPHP/Library/Think/Upload.class.php n ...
随机推荐
- Metasploit 使用MSFconsole接口
什么是MSFconsole? 该msfconsole可能是最常用的接口使用Metasploit框架(MSF).它提供了一个“一体化”集中控制台,并允许您高效访问MSF中可用的所有选项.MSFconso ...
- Python3 From Zero——{最初的意识:002~字符串和文本}
一.使用多个界定符分割字符串 字符串.split(',')形式只适用于单一分割符的情况:多分割符同时应用的时候,可使用re.split() >>> line = 'asdf fjdk ...
- gdb常用功能
1,调试core dump 文件 ulimit -c 1024:设置coredump文件大小为1024,否则默认不会生成coredump文件 gdb -c core:gdb调试该cored ...
- 【CF1215F】 Radio Stations
题目 比较精妙的\(\text{2-sat}\)建图了 还是按照套路把每个电台拆成\((0/1,i)\)表示不选/选 前两种连边是板子就不解释了 考虑如何限制选择一个唯一的\(f\),并且还能限制不选 ...
- POJ Evacuation /// 二分图最大匹配
题目大意: 在一个n*m的房间中 ‘X’为墙 ‘D’为门 ‘.’为人 门只存在与外围 人每秒钟只能向四连通区域走一步 门比较狭窄 每秒钟只能通过一个人 求所有人逃脱的最短时间 如果不可能则输出impo ...
- 【POJ】2236 Wireless Network
题目链接:http://poj.org/problem?id=2236 题意:给你n台计算机的坐标.d是可通信的最大距离.有两个操作. 1.O p 表示修复计算机p. 2.S p q表示询问pq是否能 ...
- Unity中销毁游戏对象的方式
销毁方式 销毁物体的方式有两种:Destroy和DestroyImmediate两种,那两者有什么区别呢?细听分说. 两种方式都能达到销毁物体的目的,有以下区别: Destroy销毁场景中的物体但是内 ...
- MySQL数据库之DML(数据操作语言)
对表记录的增删改 1.MySQL之DML创建数据表user create table user( id int unsigned not null auto_increment primary key ...
- redis config
网络上抄袭过来的 然后顺序自己做点笔记 http://chembo.iteye.com/blog/2054021 这里有各个key 详细的描述 # redis 配置文件示例 # 当你需要为某个配置项指 ...
- AM8不能下任何载附件及所有聊天记录无法登记
问题描述: 接收附件时,点击打开或者下载都不成功,但可以发送消息和附件.但在消息管理器中,也查询不到发送和接收的消息 原因分析:此问题是windows开机登录用户权限问题(若 登录的账号是 whx), ...