前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tp3.1.2模型学习

Tp3.1.2模型学习

作者头像
苦咖啡
发布2018-05-08 18:06:51
1.2K0
发布2018-05-08 18:06:51
举报
文章被收录于专栏:我的博客

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’] = ‘Joyous’; $data[‘blog’] = ‘http://blog.phpfs.com/’; $user->save($data); 否则用 $user->where(“id = 1”)->save(array(‘name’=>’李四’));

更新数据方式二 $data[‘name’] = ‘Joyous’; $user->wher(“id = 5″)->date($data)->save();

//更新方式三 $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(<),elt(<=),like,between,not between,in,not in, exp

其中如果配置了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();

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年6月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
分布式数据库 TDSQL
分布式数据库TDSQL是腾讯打造的一款企业级数据库产品,具备强一致高可用、全球部署架构、高 SQL 兼容度、分布式水平扩展、高性能、完整的分布式事务支持、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档