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的更多相关文章

  1. TP5模型belongsTo和hasOne的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  2. tp5模型事件回调函数中不能使用$this

    tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...

  3. TP5模型belongsTo和hasOne这两个方法的区别

    在使用tp5模型的ORM的时候出现belongsTo和hasOne都有表示一对一的关系,但是二者并不相同.以下举例说明两者的区别: 首先有user表 字段 id name password字段 然后有 ...

  4. TP5 模型类和Db类的使用区别

    原文:http://www.upwqy.com/details/3.html 总结 在控制器中  模型操作  get() 和 all()  只能单独使用来查询数据   想要链式操作查询数据 需要使用f ...

  5. TP5模型类关键字赋值

    在写项目过程中 开始的代码如下 $ms = new MStore(); $ms->userid = $userid; $ms->address = $mc->address; $ms ...

  6. TP5模型关联问题

    在使用模型关联时:假如有表   merchant商户表   m_store 店铺表  m_store_ref 商户店铺关联表  user 普通用户表 $mer = Merchant::with([ ' ...

  7. TP5 模型事务操作

    注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...

  8. tp5模型笔记---多对多

    关联模型 一对一:HAS_ONE  以及对应的BELONEGS_TO 一对多:HAS_MANY 以及相对的BELONGS_TO 多对多:BELONGS_TO_MANY 步骤: 第一:创建Users模型 ...

  9. tp5 模型关联,多表联查实用方法

    1.模型中建立关联关系 public function goods(){ return $this->belongsTo('app\common\model\goods\Goods', 'goo ...

随机推荐

  1. pyinstaller打包多个py文件和去除cmd黑框

    1.打包多个py文件并且去除cmd黑框 格式:pyinstaller.exe -F 路径\文件名.py空格路径\文件名.py空格--noconsole pyinstaller.exe -F ui.py ...

  2. 全球百大最有前景AI公司出炉,中国成独角兽最强诞生地

    https://new.qq.com/omn/20190210/20190210B0BVK2.html 硅谷最强智库之一的 CB Insights 日前发布 AI 100 2019 报告,在这 100 ...

  3. go语言的坑

    go语言在for循环中遍历的临时变量地址是一样的 func main() { //SetLogConfToEtcd() for i := 0; i < 5; i++ { a := i fmt.P ...

  4. 一次修复linux的efi引导的集中方法总结记录

    本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/grub_uefi_repair 起因:EFI分区被删除导致引导问 ...

  5. 使用深度学习的超分辨率介绍 An Introduction to Super Resolution using Deep Learning

    使用深度学习的超分辨率介绍 关于使用深度学习进行超分辨率的各种组件,损失函数和度量的详细讨论. 介绍 超分辨率是从给定的低分辨率(LR)图像恢复高分辨率(HR)图像的过程.由于较小的空间分辨率(即尺寸 ...

  6. Tcl数学运算

    expr 数学表达式 Tcl支持的数学操作符(优先级按照从高到低): -一元负号 +一元正号 ~按位取反 !逻辑非 *乘 /除 %取余 +加号 -减号 <<左移位 >>右移位 ...

  7. 2019 SDN第6次上机作业

    1.作业要求: 作业链接 参考资料: Ryu控制器的API文档:ryu.app.ofctl_rest Ryu的拓扑展示 助教博客:基于RYU restful api实现的VLAN网络虚拟化 2.具体操 ...

  8. Compute API 关键概念 详解

    Compute API 是 RESTful HTTP 服务,提供管理虚机的能力. 虚机可能有不同的内存大小,CPU数量,硬盘大小,能够在几分钟之内创建出来.和虚机的交互,可以通过Compute API ...

  9. 在IDEA上对SpringBoot项目配置Devtools实现热部署

    spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...

  10. 对异步处理的http接口进行性能测试

    以前对接口做性能测试,接口都是同步处理的,请求之后等待响应结果就知道处理结果了,这样只要看这个接口是否异常,如果无异常无报错记录这个接口的响应时间.TPS等性能指标进行分析就可以了,最近在工作中遇到了 ...