Tp3.1.2模型学习

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();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ml

------------数据库的加锁操作(上)

       从事一个项目,需要考虑数据的安全性,之前对于数据库这部分的数据操作学习的比较零散,由于手头的项目,于是系统的 学习了下数据库操作加锁的知识: --...

577100
来自专栏PingCAP的专栏

TiDB 源码阅读系列文章(三)SQL 的一生

上一篇文章讲解了 TiDB 项目的结构以及三个核心部分,本篇文章从 SQL 处理流程出发,介绍哪里是入口,对 SQL 需要做哪些操作,知道一个 SQL 是从哪里...

456150
来自专栏王硕

原 PostgreSQL用C完成存储过程例子

362100
来自专栏智能大石头

5,ORM组件XCode(动手)

本篇才真正是XCode教程第一篇。《速览》是为了以最简洁的语言最短小的篇幅去吸引开发者;《简介》则是对XCode组件和XCode开发模式的一个整体介绍,让开发者...

22390
来自专栏北京马哥教育

数据库的最简单实现

所有应用软件之中,数据库可能是最复杂的。 MySQL的手册有3000多页,PostgreSQL的手册有2000多页,Oracle的手册更是比它们相加还要厚。 但...

30560
来自专栏程序员的SOD蜜

PDF.NET(PWMIS数据开发框架)之SQL-MAP目标和规范

SQL-MAP的目标: 集中管理SQL语句,所有SQL语句放在专门的配置文件中进行管理; 通过替换SQL配置文件,达到平滑切换数据库到另外一个数据库,比如从O...

27980
来自专栏程序猿

带您理解SQLSERVER是如何执行一个查询的

带您理解SQLSERVER是如何执行一个查询的 连接方式和请求 如果你是一个开发者,并且你的程序使用SQLSERVER来做数据库的话 你会想知道当你用你的程序执...

55290
来自专栏大内老A

在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?

继续讨论EF中使用存储过程的问题,这回着重讨论的是为存储过程的参数进行赋值的问题。说得更加具体一点,是如何为实体映射的Delete存储过程参数进行赋值的问题。关...

23590
来自专栏Kevin-ZhangCG

[ SSH框架 ] Hibernate框架学习之二

20650
来自专栏JetpropelledSnake

SQL学习之SQL注入总结

40130

扫码关注云+社区

领取腾讯云代金券