1.模型定义
命名规则是除去表前缀的数据表名称,采用驼峰命名,并且首字母大写,然后加上后缀Model
其中tableName是不包含表前缀的数据表名称,一般用于模型和表名称不同时候需要定义
其中trueTableName是包含千醉的表名称,这就说如果表为数据库中实际操作的表
dbName是要对应的数据库,只有跨库操作才需要定义
2.模型实例化
$User = new Model(‘User’);//等效与$User = M(‘User’);
这样的没有办法进行业务相关的逻辑处理
$User = new CommonModel(‘User’);//第一个参数是模型名称,第二个是表前缀,第三个是数据库连接信息
这样就可以携程$User = M(“CommonModel:User”);//当时CommonModel必须继承系统的Model
自定义模块可以用D方法进行实例化 $User = D(‘News’);
D方法可以自动检测模型类,存在自定义则试用自定义,不存在则实例化Model基类,实例化过的模型不会重复实例化
D方法支持跨项目和分组调用D(“Admin://User”)实例化Admin项目中的User模型,D(“Admin/User”);实例化admin分组的User模型
实例化空模型可以使用new Model()或者 M();
‘DB_FIELDS_CACHE’=>false //可以关闭字段缓存,调试模式下默认是关闭的
3.连接数据库配置
return array(
‘DB_TYPE’ => ‘mysql’, // 数据库类型
‘DB_HOST’ => ‘localhost’, // 服务器地址
‘DB_NAME’ => ‘test’, // 数据库名
‘DB_USER’ => ‘test’, // 用户名
‘DB_PWD’ => ‘test’, // 密码
‘DB_PORT’ => 3306, // 端口
‘DB_PREFIX’ => ‘test_’, // 数据库表前缀
);
可以使用DB_DSN方式连接,可以用pdo形式
4.分布式数据库
return array(
‘DB_TYPE’ => ‘mysql’, //分布式数据库类型必须相同
‘DB_HOST’ => ‘192.168.0.1,192.168.0.2’,
‘DB_NAME’ => ‘test’, //如果相同可以不用定义多个
‘DB_USER’ => ‘test1,test2’,//帐号,如果一样可以只写一个
‘DB_PWD’ => ‘test1,test2’,//密码
‘DB_PORT’ => ‘3306’,//如果端口一样可以写一个
‘DB_PREFIX’ => ‘test_’,
‘DB_RW_SEPARATE’=>true,//默认读写不分离,需要分离请设置
可以配置多个主数据库
);
5.创建数据
create()可以创建数据对象,$user = D(‘User’);
$user->create();//默认获取post数组,验证数据源合法性,检查字段类型,判断插入还是更新
自动验证,自动完成,表单令牌验证,表单数据过滤,数据自动完成,生成数据对象(这个时候保存内存中)
只有当调用了add()或者save方法才会保存到数据库
6.ADD方法
$user = M(“User”);
$data = array(‘name’=> ‘新闻标题’, ‘content’ => ‘新闻内容’);
//方法一
$user->add($data);
//方法二
$user->data($data)->add();
//方法三
$user->create();//获取POST的数据
$user->add();
查询方法select返回多行记录而find只会返回一行记录;getField可以指定返回字段值
更新数据方式一
如果id是主见可以这样更新数据
$data[‘id’] = 1;
$data[‘name’] = ‘
更新数据方式二
$data[‘name’] = ‘
//更新方式三
$user->create()->save();//更具 提交的post数据创建对象进行更新,需要主键
更新某个字段
setField($field, $value=”);//其中可以支持传递数组
setInc($field, $step = 1);//增加
setDec($field, $step = 1);//减少
删除记录支持order以及limit连贯操作
7.ActiveRecord
创建数据
$user->name = ‘Joyous’;
$user->email=’joyousphper@gmail.com’
$user->add();//将数据保存到数据库
同样,在我们用
$user->create();方法之后仍然可以用
$user->name = ‘Joyous’;//更改属性值
查询记录
$user->find(8);//这个只能查询主键
根据字段查询
$user->getByName(“Joyous”);//相当于$user->wherr(“name=’Joyous'”)->select();
//根据主键查询多个数据
$user->select(“1,2,3,6”);
更新记录
$user->find(1);//多了一次查询,可以用$user->id = 1;也可以
$user->name = ‘Joyous’;
$user->save();//保存数据
删除记录
$user->delete(2);//可以根据主键直接删除
$user->delete(“3,45”);
8.自动验证
$_validate属性,二维数组,其中array(验证的字段,验证规则,错误提示,[验证条件,附加条件])
验证的字段是来自表单的字段
验证规则可以系统的require,email,url,currency,number等
错误提示可以用$user->getError();获取
验证条件Model::EXISTS_VALIDATE 或者0标识存在字段就验证,Model::MUST_VALIDATE或者1必须验证 Model::VALUE_VALIDATE
2标识不为空则验证
附加规则,正则、函数,callback,confirm,equal,in等,默认用regex
自定义验证规则
$user = D(“User”);
$validate = array(array(‘verify’,’require’, ‘验证码必须’));
$user->setProperty(“_validate”, $validate);
多字段callback验证
protected $_validate = array(
array(‘user_id,good_id’, ‘checkIfOrderToday’, ‘今天已经购买过,请明天再来’, 1,’callback’, 1),
);
protected function checkIfOrderToday($data){
$map = $data;
$map[‘ctime’] = array(array(‘gt’,[开始时间]), array(‘lt’, [结束时间]));
if($this->where($map)->find())
return false;
else
return true;
}
patchValidate = true;在模型中定义就可以批量进行验证
check函数验证
$model->check($vale, ’email’);//默认用正则
9.命名范围
参考手册,主要是方便连贯操作
protected $_scope = array(
// 命名范围normal
‘normal’=>array(
‘where’=>array(‘status’=>1),
),
// 命名范围latest
‘latest’=>array(
‘order’=>’create_time DESC’,
‘limit’=>10,
),
);
使用
$Model->scope(‘normal’)->select();
生成SQL语句SELECT * FROM think_news WHERE status=1
目的,这样可以定义一个可以多次使用
10.自动完成
定义$_auto属性
默认填充时间是插入数据(插入,更新,插入和更新)的时候,默认插入规则是字符串插入有函数,回调,其他字段填充,字符串形式
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当前最新时间
当然也可以自定义自动填充,参考自动验证
11.查询建议
虽然where语句中可以传入字符串和数组,但是建议用数组,默认试用and操作,如果需要更改之间逻辑,可以
$condition[‘_logic’] = ‘or’;
表达式查询,$map[‘字段’] = array(‘表达式’,’查询条件’);
其中表达式eq(=),neq(<>),gt(>),egt(>=),lt(
其中如果配置了DB_LIKE_FIELDS字段,那么配置的字段将进行模糊匹配
快捷查询
$map[‘name|title’] = ‘joyous’;
$user->where($map)->select();
12.字段排除
$model->field(‘id,name’)->select();//查询id和name字段
$model->field(‘create_time’,true)->select();//除了create_time之外的字段
13.事务支持
$user->startTrans();//需要数据库本身支持,比如mysql的MyISAM引擎不支持事务
if(成功) {
$user->commit();
} else {
$user->rollback();
}
14.高级模型
必须继承AdvModel
支持字段过滤,定义$_filter属性
支持字段序列化,定义$serializeField属性
文本字段定义$blobFields属性
只读字段类保护特殊的字段值不被更改,定义readonlyField属性
延迟更新需要$user->where(‘id=3’)->setLazyInc(‘score’, 10, 60);//用户积分延迟60s更新
数据分表定义$partition,其中array(
‘field’=>’name’,//要分表的字段,通常按照字段的值进行分表
‘type’ => ‘md5’,//分表的规则,包括id,year,mod,md5函数和首字母
‘expr’=>’name’,//分表辅助表达式 可选 配合不同的分表规则
‘num’=>’name’,//分表的数目
);
自定义返回类型,可以定义为对象,默认为数组
15.视图模型
继承ViewModel
定义viewFields属性
public $viewFields = array(
‘Blog’ => array(‘id’, ‘name’, ‘title’,’_table’=>’test.my_blog’),
‘Category’ => array(‘title’=>’cate_name’, ‘_on’ =>’Blog.category_id=Category.id),
‘User’ => array(‘name’=>’username’, ‘_on’ =>’Blog.user_id=User.id’),
);
//其中视图的表是用_table来定义,可以用_as来定义别名
_on来定义关联查询类型
定义join类型可以用_type
可以定义统计字段
使用视图
$model = D(“BlogView”);
$model->field(‘id,name,title,cate_name,username’)->where(“id>10”)->select();
16.关联模型
关联关系:一对一,一对多,多对多
定义$_link属性,可以动态定义,需要继承RelationModel类
其中mappint_type是关联类型;class_name关联的模型名,会自自动定位到相关数据表;
mapping_name是关联的映射名称,没有定义则试用class_name,如果class_name也没有则用数组索引
foreign_key外键默认为数据对象的_id,如果是User,那么外键就是user_id,如果不是则定义;
condition关联条件自动添加外键的值,如果是额外的需要定义;
mapping_fields关联要查询的字段,默认全部查询;
as_fields把关联的字段值映射成数据对象某一个字段的值
关联查询
$user=D(“User”);
$user->relation(true)->find(1);
关联操作可以参考手册内容
17.动态模型
$user=M(“User”);
$user->switchModel(“Adv”)->top10();//切换到高级模型执行top10查询
或者用$user = M(“AdvModel:User”)->top10();