thinkPHP学习小结

/********
------
模型:
------
/********


一、定义:******************************

模型名(类名)    约定对应数据表(假设数据库的前缀定义是 think_)
UserModel    think_user
UserTypeModel    think_user_type
 
protected $tableName = 'categories';     //改变默认表
protected $trueTableName = 'top_depts'; //改变默认表及前缀
protected $dbName = 'top';         //改变默认数据库


二、实例化:*****************************

1、实例化基础模型
$user = new Model('User');

$user = M('User');

2、实例化其他公司模型类
$User = new CommonModel('User');

$User = new CommonModel('User','think_','db_config');

$User = M('CommonModel:User','think_','db_config');


3、实例化用户自定义模型类
D()方法

4、实例化空模型

5、跨库操作
$User = M('user.User', 'other_');    //实例化user数据库的other_user表


三、字段定义:*****************************

1、字段缓存文件在Data/_fields目录下面
可以通过下面配置关闭字段缓存
'DB_FIELDS_CACHE'=>false

2、若想不使用字段缓存功能,可以在模型类中添加fields属性即可,如
class UserModel extends Model{
    protected $fields  =array('id','username','email','_pk'=>'id','_autoinc'=>true);
}

3、获取字段信息
$fields = $User->getDbFields();

4、获取数据表主键
$pk = $Model->getPk();

5、字段映射

6、自动验证(字段验证)
验证格式:array(验证字段, 验证规则, 错误提示, [验证条件]附加规则,验证时间])
示例:
protected $_validate         =         array(
array('verify','require','验证码必须!'), //默认情况下用正则进行验证
array('name','','帐号名称已经存在!',0,'unique',1), // 在新增的时候验证name字段是否唯一
array('value',array(1,2,3),'值的范围不正确!',2,'in'), // 当值不为空的时候判断是否在一个范围内
array('repassword','password','确认密码不正确',0,'confirm'), // 验证确认密码是否和密码一致
array('password','checkPwd','密码格式不正确',0,'function'), // 自定义函数验证密码格式

);

$User = D("User"); // 实例化User对象
$validate    =    array(
array('verify','require','验证码必须!'), // 仅仅需要进行验证码的验证);
$User-> setProperty("_validate",$validate);
$User->create();    //该机制需要使用create()方法才能生效

6、自动完成(字段自动完成)
在Model类定义$_auto属性,可以完成数据自动处理,默认值、数据过滤及其他系统写入字段;该属性是由多个填充因子

组成的数组。
填充因子格式:array(填充字段, 填充内容, [填充条件, 附加规则])
示例:
protected $_auto = array (
array('status','1'),  // 新增的时候把status字段设置为1
array('password','md5',1,'function') , // 对password字段在新增的时候使md5函数处理
array('name','getName',1,'callback'), // 对name字段在新增的时候回调getName方法
array('create_time','time',2,'function'), // 对create_time字段在更新的时候写入当前时间戳
);

$auto = array (
array('password','md5',1,'function') // 对password字段在新增的时候使md5函数处理
);
$User-> setProperty("_auto",$auto);
$User->create();    //该机制需要使用create()方法才能生效



四、属性访问:*****************************

1、对象方式访问, find(),data(),create()方法可以
$User = D('User');
$User->find(1);
echo $User->name;    //获取属性
$User->name = 'TP';    //设置属性值

2、数据方式
$User = D('User');
$User->find(1);
echo $User['name'];    //获取属性
$User['name'] = 'TP';    //设置属性值



五、查询语句

1、查询方式
普通字符串作为查询条件 - 安全性需要自己考虑
$User->where('type=1 and status=1')->select();

数组作为查询条件
$condition['name'] = 'thinkphp';
$condition['status'] = 1;
$condition['_logic'] = 'OR';    //修改字段间的逻辑关系是 逻辑或(OR),默认为AND
$User->where($condition)->select();

对象方式来查询
condition->name = 'thinkphp';
$condition->status= 1;
$User->where($condition)->select();


2、表达式查询
上面的查询方式都是简单的相等判断,可以使用更多的试查询,格式
$map['字段名'] = array('表达式', '查询条件');
表达式        含义
EQ        =
NEQ        <>
GT        >
EGT        >=
LT        <
ELT        <=
LIKE        like
[NOT] BETWEEN    (不在)区间查询
[NOT] IN    (不在)IN查询
EXP        表达式查询,支付SQL语法
|        不同字段相同的查询条件
&        不同字段不同的查询条件
区间查询

示例:
EQ :等于(=)
例如:$map['id']  = array('eq',100);
和下面的查询等效
$map['id']  = 100;
表示的查询条件就是 id = 100


LIKE: 同sql的LIKE
例如:$map['name'] = array('like','thinkphp%');
查询条件就变成 name like 'thinkphp%'
如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。例如设置了:
'DB_LIKE_FIELDS'=>'title|content'
的话,使用
$map['title'] = 'thinkphp';
查询条件就会变成 name like '%thinkphp%'


[NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组,例如:
$map['id']  = array('not in','1,5,8');
和下面的等效:
$map['id']  = array('not in',array('1','5','8'));
查询条件就变成 id NOT IN (1,5, 8)
 

EXP:表达式,支持更复杂的查询情况
例如:
$map['id']  = array('in','1,3,8');
可以改成:
$map['id']  = array('exp',' IN (1,3,8) ');
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。查询

表达式不仅可用于查询条件,也可以用于数据更新,例如:
$User = M("User"); // 实例化User对象
// 要修改的数据对象属性赋值
$data['name'] = 'ThinkPHP';
$data['score'] = array('exp','score+1');// 用户的积分加1
$User->where('id=5')->save($data); // 根据条件保存修改的数据

 
另有:
实现不同字段相同的查询条件
$map['name|titlle'] = 'thinkphp';
name = 'thinkphp' OR title = 'thinkphp'

实现不同字段不同的查询条件; '_multi'=>true必须加在数组的最后,表示当前是多条件匹配
$map['status&score&title'] = array('1', array('gt','0'), 'thinkph', '_multi'=>true);
 status= 1 AND score >0 AND  title = 'thinkphp'


区间查询:一个字段不同查询条件
map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查询条件是:
(`id` > 1) AND (`id` < 10)

$map['name']  = array(array('like','%a%'), array('like','%b%'), array('like','%c%'),'ThinkPHP','or');
最后的查询条件是:
(`name` LIKE '%a%') OR (`name` LIKE '%b%') OR (`name` LIKE '%c%') OR (`name` = 'ThinkPHP')


3、组合查询
各种查询方式可以混合使用
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询

(_complex)、请求字符串查询(_query)。


字符串模式查询(_string):
$User = M("User"); // 实例化User对象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();
最后得到的查询条件就成了:
( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )


请求字符串查询(_query):
类似于URL传参的方式,可以支持简单的条件相等判断。
$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';
得到的查询条件是:`id`>100 AND (`status` = '1'OR `score` = '100')


复合查询(_complex):
复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
例如:
$where['name']  = array('like','%thinkphp%');
$where['title']  = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id']  = array('gt',1);
查询条件是
( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。


4、统计查询
方法        说明
count        统计数量    
max        获取最大值
min        获取最小值
avg        获取平时值
sum        获取总分


5、SQL查询
原生的SQL语句查询

query 执行SQL查询操作
$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->query("select * from think_user where status=1");


execute 执行更新和写入数据的SQL操作
$Model = new Model() // 实例化一个model对象 没有对应任何数据表
$Model->execute("update think_user set name='thinkPHP' where status=1");


6、快速查询方法
find()

getBy+()
getFieldBy+()
top+()


7、子查询

8、查询锁定

9、字段排除

10、事务支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值