/********
------
模型:
------
/********
一、定义:******************************
模型名(类名) 约定对应数据表(假设数据库的前缀定义是 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、事务支持
------
模型:
------
/********
一、定义:******************************
模型名(类名) 约定对应数据表(假设数据库的前缀定义是 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、事务支持