TP5 模型CURD
ThinkPHP5的模型是一种对象-关系映射(Object / Relation Mapping ,简称 ORM)的封装,并且提供了简洁的ActiveRecord实现。一般来说,每个数据表会和一个“模型”对应。
ThinkPHP5 模型类和Db类的区别主要在于对象的封装,Db类的查询默认返回的是数组(或者集合),而模型类返回的是当前的模型对象实例(或者集合),模型是比Db类更高级的数据支持模型关联、模型事件。

ThinkPHP5 模型属性$table 不再是包含表前缀的表名;$name则是包含表前缀的表名。
一般来说,模型的属性名 就是对应的数据表的字段名。
Model模型类
· protected $name; //包含表前缀的数据表
· protected $table; //不包含表前缀的数据表,使用的时候要加上表前缀
如: protected $table = ‘tp_admin_user’;
模型类 的public类型属性 就是对应的表的字段名。如果给模型类的属性不对应字段名的话,会报错。
$user = new User; // User为模型类
$user->user_name = ‘admin’; // user表 user_name 字段
$user->password = md5(‘123456’); // user表 password 字段
$user[‘user_name’] 等同 $user->username;
疑惑:如果此时使用save()方法,会是修改 还是 什么情况?
$user->save(); //此时为新增!!!
因为当 $user对象没有给定 主键的时候,此时为新增; 如果给定主键,此时为修改!
另外一种新增数据为 模型::create();
那么问题来了,什么时候使用save() 或 create()呢?
·新增数据

由此可见,当实例化模型的时候,使用 save() 或 saveAll() 方法进行添加。
如果使用 模型类, 就使用 XXModel::create(); 进行添加
$user = new User; // User为模型类
此时$user->save($data) 或 User::create($data); 两者返回的还是模型的实例化对象,不同的是User模型类create()后 返回的是 新new的对象而已。
--------------------------------------------
批量新增数据

实际操作的时候,是执行了多条的insert into 数据。并非真的一次性插入。
查询

· getBy字段名(); 查询对应的单条查询,字段名第一个字母要大写!
如: 查询 level_id字段的值为4的这条信息
$user->getByLevelId(4);
如:查询 name 字段的值为 admin的这条信息
$user->getByName(‘admin’);
$user = new User; //User 为模型类
$user->getBy字段名(‘值’); //返回当前 字段名= 值 的这条信息.
$user->getData(); //可以将单条信息 转换为 数组
注意:getBy字段名(), 如果字段名有”_”, 同样将首字母和_后的首字母转为大写!!!
·get() 可查询主键 或 非主键
如:查询主键为1的单条信息
$user->get(1);
如:表没有主键,可使用数组来传递查询
$data = [‘name’=>’site_name’];
$user->get($data); //查询没有主键的 单条数据
或 使用 where为追加条件
$map = ['level_id'=>2];
$result3 = $model->where($map)->find();
更改

$user = new User; //User为模型类
$user->save($data, $where条件);
Model::update($dasta, $where条件);
上面讲过,如果没有给定主键 此时 $user->save(); 为新增,如果当表中没有主键怎么办?
$user->isUpdate(true)->save(); //强制为更新操作
以下内容为知识扩展,不要拿到实战中,否则潜在问题会困扰很久!!
还有一种情况是 $user = User::get(1); $data = [.. ...]; 如果没有给定主键,是新增吗?
答案是修改!!! 因为$user 是 User::get(1)返回的对象,1就是主键,所以此时为修改,并非进行新增操作!!!
问题又来了,如果我现在就想把$user->save($data); 为新增,该怎么操作?
答: $user->主键 = NULL; 再 $user->isUpdate(false)->save($data); 此时为新增操作。
问题又来了,新增后的数据信息,除了主键,$data中不存在的信息,则是复制User::get(1)默认的数据!!!!! 这招太坑
最好使用 Model::create() 或 干脆直接new Model 再save(),一般不建议使用 User::get(1) 这种直接返回实例化的对象 再进行CURD;
删除操作

Model::destory(主键id);
如: User::destroy(33); // 删除主键33的单条信息
对象->where(条件)->delete();
如: $user->where(‘id =5 ’)->delete(); //删除主键5的单条信息
学习模型总结:
·新增数据
·批量新增
·查询数据
·数据列表
·更新数据
·删除数据
小技巧总结:
·获取模型类对应表的字段名, new 模型类,再使用 属性进行相关操作
如: $user = new User; //User为模型类
$user->user_name 与 $user[‘user_name’] 等同!!
因为基类Mode类 implements \ArrayAccess , 可以将属性当成数组的形式来访问。
·数据表存在“_”的问题
如果数据表存在下划线,将下划线去掉,模型的名字首字母大写。
如: tp_admin_user, 对应的模型名 AdminUser .
·如果数据表 与 当前模型名称不一致,怎么办?
在模型类内 protected $name =”要关联的表名”;
如: tp_admin_user, User模型 protected $name = ‘user’;
·模型类 或 模型对象 get() 或 find() 查询后的结果 怎么转成数组?
通过 getData()方法,
如: $result = $user->find(1); $result->getData();
·模型类 或 模型对象 all() 或 select() 查询后的结果 怎么转数组?
此时查询的多条信息为 结果集!! 不能使用getData()一次性转数组,
可以使用foreach() 来逐条转为数组,但太麻烦!!!。
通过 collection(结果集)->toArray();
如: $result = $user->select(); $data = collection($result)->toArray();
TP5 模型CURD的更多相关文章
- TP5模型belongsTo和hasOne的区别
在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...
- tp5模型事件回调函数中不能使用$this
tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...
- TP5模型belongsTo和hasOne这两个方法的区别
在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...
- TP5 模型类和Db类的使用区别
原文:http://www.upwqy.com/details/3.html 总结 在控制器中 模型操作 get() 和 all() 只能单独使用来查询数据 想要链式操作查询数据 需要使用f ...
- TP5模型类关键字赋值
在写项目过程中 开始的代码如下 $ms = new MStore(); $ms->userid = $userid; $ms->address = $mc->address; $ms ...
- TP5模型关联问题
在使用模型关联时:假如有表 merchant商户表 m_store 店铺表 m_store_ref 商户店铺关联表 user 普通用户表 $mer = Merchant::with([ ' ...
- TP5 模型事务操作
注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...
- tp5模型笔记---多对多
关联模型 一对一:HAS_ONE 以及对应的BELONEGS_TO 一对多:HAS_MANY 以及相对的BELONGS_TO 多对多:BELONGS_TO_MANY 步骤: 第一:创建Users模型 ...
- tp5 模型关联,多表联查实用方法
1.模型中建立关联关系 public function goods(){ return $this->belongsTo('app\common\model\goods\Goods', 'goo ...
随机推荐
- createTextRange 创建文本对象
document.body.createTextRange 主要是用来对一些文本对象进行操作.比如你有一大段文字,都在同一个P标签内,但是你只希望通过JS改变其中的一小部分,这时就可以用createT ...
- selenium模块及类组织关系
问题:webdriver子模块中为什么可以直接使用类Chrome.ChromeOptions.Firefox.FirefoxProfile... 在webdriver的__init__.py文件中已经 ...
- 编程用泰勒公式求e的近似值,直到最后一项小于10的负6次方为止。
#include<stdio.h>#include<math.h>void main(){ int n; float j=1.0,sum=1.0; for(n=1;;n++) ...
- 学习Spring-Data-Jpa(八)---定义方法查询
1.查询策略 spring-data一共有三种方法查询策略: QueryLookupStrategy.Key.CREATE,尝试根据方法名进行创建.通用方法是从方法名中删除一组特定的前缀,然后解析该方 ...
- 003-转载-keil-STM32硬件错误HardFault_Handler的处理方法
(一)参考文献:https://blog.csdn.net/electrocrazy/article/details/78173558 在用Keil对STM32的程序进行仿真时程序有时会跑飞,停止仿真 ...
- Centos 7配置nginx反向代理负载均衡集群
一,实验介绍 利用三台centos7虚拟机搭建简单的nginx反向代理负载集群, 三台虚拟机地址及功能介绍 192.168.2.76 nginx负载均衡器 192.168.2.82 web ...
- 【Excel】定位条件快速将空值替换为指定值
现有如下表格,表格中存在一些空值,如下图: 目的 将上图的空值全部赋值为100,实现后效果如下: 实现步骤 1.选中数字区域,按CTRL+G 2.点击[定位条件]后,选择[空值]后[确定] 3.在编辑 ...
- 【2019.12.04】SDN上机第6次作业
实验拓扑 通过图形化界面建立拓扑 先清除网络拓扑 sudo mn -c 生成Python语句 #!/usr/bin/python from mininet.net import Mininet fro ...
- K8S从入门到放弃
K8S介绍相关 kubernetes(K8S)集群及Dashboard安装配置 kubernetes(K8S)创建自签TLS证书 K8S Kubernetes 架构 K8S组件 K8S API对象 K ...
- 微信小程序全局设置分享内容
微信小程序每个页面都可以在onShareAppMessage中设置分享内容,如果想要全局设置成一样的分享内容如何设置呢? 在app.js中新增以下方法: //重写分享方法 overShare: fun ...