数据据操作 tp5

数据库操作-DB类

学习手册

数据库配置

注意1:在TP里面,可以在模块下面单独的建立一个database.php配置文件,代表这个模块就使用配置的这个数据库

注意2:我们可以在config.php里面配置多个数据信息也是可以的

数据库操作-查询

先在控制器引入Db类

使用Db类的query方法即可

查询也可以使用占位符

数据库操作-增删改

使用Db类的execute方法

数据库切换

  1. 在application/config.php里面配置一个db1的数据库信息

  1. 使用Db::connect(‘db1‘) 获取 dedecms数据库里面的数据

手册:

构造器-查询

方式一:获取所有的数据

效果

方式二:获取单条数据(a. 根据主键 b.查询条件)

效果

例如:查询用户名为caoyang的记录

构造器-添加

构造器-更新

构造器-删除

别名处理

对于上面的查询构造器,使用的是Db::table(表前缀的表名),可以换一种方式来不写表前缀

Db::name(‘不要表前缀的表名‘)

建议使用Db::name()方法调用

助手函数

在新版TP5里面已经不存在M()函数(tp3.2的时候可以帮我们实例化系统的模型)使用的是db()帮助函数进行替换

db(‘不要前缀的表名‘)->select();

闭包查询

db(‘admin‘)->select(function($query){

// $query里面可以设置查询的条件

});

使用Query对象查询

有点类似laravel里面的查询构造器

模型学习

在MVC里面,M是负责对数据的处理,其实在TP5里面模型封装的已经很好了,基本上我们不用做过多的操作,使用系统自带的基类即可完成大部分的curd操作。

模型定义

需要写在模块的model目录下,我们可以使用TP5自带的命令行工具进行生成。

注意1:在TP5里面模型也不在使用类后缀,直接就是使用去除表前缀后的名称作为模型的名称。(模型名称使用大驼峰的方式)

例如:表的名称为 sh_admin 对应的模型文件名称 Admin.php

例如:表的名称为 sh_goods_attribute 对应的模型文件名称 GoodsAttribute.php

>php think make:model app\index\model\User

创建后

定义sh_user表

上面的模型和下面的sh_user是对应的

基本操作-增加

完成数据的增加主要有如下几种方法

  1. 模型对象的save方法(先为对象设置属性)
  2. 模型类的create静态方法
  3. 模型对象的saveAll批量添加方法

实操:

1.模型对象的save方法(先为对象设置属性)

2.模型类的create静态方法【简化操作】

3.模型对象的saveAll批量添加方法【上面的两种操作,都只能完成单条数据的插入,如果批量插入数据,需要使用模型对象的saveAll方法】

基本操作-查看

查询数据主要有如下几种方法

  1. 模型类的get静态方法【存在返回值为对象,否则为null】
  2. 通过字段查询getByFieldname()方法
  3. 根据条件查询get([‘username‘ => ‘root‘])
  4. where方法查询->find()
  5. where方法查询->select()
  6. 模型类的all静态方法和select静态方法

实操:

1.模型类的get静态方法【存在返回值为对象,否则为null】,通过传递主键获取数据

效果

2.根据条件查询get([‘username‘ => ‘root‘])

方式一:

方式二:使用where方法传递(需要注意后面要通过find()方法调用一下)

3.通过模型对象的字段查询getByFieldname(‘查询条件‘)方法

  1. 模型类的where方法查询,然后调用find()方法

5.where方法查询->select()

方式一:

方式二:

6.模型类的all静态方法和select静态方法

注意:对应all和select方法返回的数据,是一个数组,数组中的每个元素是一个模型对象,如果我们需要把他们转换为普通的二维数组(数组中的元素也是数组)

效果:

便捷方式获取模型实例

在新版的Tp5里面可以有如下两种便捷方式获取模型实例:

方式一:使用model助手函数

方式二:使用TP5自带的Loader类的model静态方法

总结:在新版的TP5里面,在原先TP3.2里面的单字母函数D已经不存在,取而代之的是model函数。

基本操作-更新

更新数据主要有如下几种方法

1.先 get(),后save()

2.模型类update静态方法

实操:

1.先调用模型类的get()静态方法,然后在调用模型对象的save()方法

2.模型类update静态方法

方式一:

方式二:

基本操作-删除

删除数据主要有如下几种方法

1.先使用模型类的get()静态方法,然后在使用模型对象的delete()方法

2.模型类destroy静态方法

实操:

1. 先使用模型类的get()静态方法,然后在使用模型对象的delete()方法

2.模型类destroy静态方法

3.使用destroy同时删除多条数据

4.模型对象的delete方法进行删除(需要传递删除条件)

相关文档

网站:https://www.kancloud.cn/manual/thinkphp5/135186

模型关联

注意:在TP里面的模型关联没有laravel里面那么好用,简单的了解即可,一般来说,还是建议自己在代码里面完成模型间的关系处理。不要过来的依赖模型关联。

在TP里面主要是定义三种模型关联类型:

一对一

简介

注意:一对一的关系是可以在一张表里面完成的,但是一般来说,数据有冷热之分,热数据(查询频繁的数据,应该单独的抽取称为一张表,水平方向字段数应该尽可能的少)冷数据(查询较少的数据,单独的放在另外的一张表里面进行操作,通过一个外键和热数据表进行关联。例如下面的表里面的是通过sh_profile表里面的user_id产生的关联。)

场景:例如一个用户存在一个具体的用户履历信息

sh_user 用户表


id


username


passsword


email


1


caoyang


admin88


[email protected]


3


andy


admin88


[email protected]

sh_profile 履历表


id


user_id


address


card_id


education


......


23


1


深圳市


421023112


本科


........


34


3


广州市


7754123123


硕士

自己手工的连表查询:

> select a.*, b.address  from sh_user a left join sh_profile b on a.id = b.user_id where a.id = 3;

关联查询

  1. 建立用户表和履历表

  1. 创建User.php和Profile.php模型文件,并在User.php模型文件里面定义模型关联信息

履历表模型

  1. 查询关联信息

效果:

对于上面的操作,完全可以自己写sql完成

百度:链式操作

http://www.thinkphp.cn/topic/43233.html

关联添加

1. 完全可以自己去在代码里面完成,没必要依赖TP的关联模型

  1. 使用Tp的关联模型进行数据的添加

一对多

简介

一对多的模型还是很常见的,一般解决方法就是增加一张附加表,然后在附加表里面增加一个关联字段。

常见:一个用户可以存在多本书籍。

sh_user表:


id


username


passsword


email


1


caoyang


admin88


[email protected]


3


andy


admin88


[email protected]

sh_book表


id


user_id


img


author


title


....


1


3


1.jpg


莫言


分录肥臀


3


3


3.jpg


西红柿


斗战

关联查询

  1. 创建book模型,并且在user模型里面定义关联关系

定义关系

  1. 构造测试数据

  1. 查询数据

关联添加

1. 不依赖TP的关联模型,自己手工的解决

  1. 使用Tp的关联模型完成

多对多

文档:https://www.kancloud.cn/manual/thinkphp5/142359

自动验证

相关文档:https://www.kancloud.cn/manual/thinkphp5/129319

场景:用户的添加的时候完成自动验证,在TP5里面可以使用多种方式完成验证操作。

验证类文件-方式一

  1. 在模块下建立一个validate目录,编写对应的验证类(类文件的名称和模型名称一致)

  1. 在控制器中使用模型对象的validate方法调用

效果

验证类文件-方式二

控制器验证-方式一

  1. 调用控制器的$this->validate(验证数据,验证类名称)方法

控制器验证-方式二

1.调用控制器的$this->validate(验证数据,验证的规则)方法

注意:验证通过返回true,否则返回错误的提示信息

注意:如果用户想自定义验证提示信息,则可以传递第三个参数

系统验证类的使用

在有的时候我们不希望自己定义验证类来处理,可以使用系统自带的Validate类进行验证

验证类的静态方法

演示

验证场景

TP里面使用了一种叫做验证场景的概念,针对不同的场合使用不同的验证,例如:在添加的时候有添加的验证规则;在更新的时候有更新的规则

表单验证

主要是为了防止外站提交(csrf攻击)

解决:

1. 在服务器返回表单信息的之前,生成一个唯一的密钥,然后在表单里面的隐藏域里面存放一下,同时还要把数据存到session里面一下。

2. 用户填完信息后,点击提交后,检测用户表单隐藏域里面的密钥和session里面的时候一样,一样则没有伪造提交(外站提交)

实现:

1. 在提交表单里面使用token()函数生成一个隐藏域

  1. 在自动验证里面进行验证

坑-dateFormat验证规则

在TP5如果需要验证某个时间数据,可以指定验证个还是,我们可以使用dateFormat规则,同时为其传递一个验证的规则字符串。

查看Validate底层的dateFormat方法

相关文档:

http://code.ziqiangxuetang.com/php/func-date-parse-from-format.html

SQL调试

本地调试模式开启

修改config.php配置文件即可

打印最后执行的sql

原文地址:https://www.cnblogs.com/ampl/p/8297160.html

时间: 2024-10-10 10:27:13

数据据操作 tp5的相关文章

JAVASE02-Unit08: 文本数据IO操作 、 异常处理

Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; /** * java.io.Ob

Meteor:客户端数据变更操作

关于客户端进行数据变更操作,meteor提供了两套机制: 客户端CRUD+服务端deny/alllow 服务端methods CRUD操作的层次是在数据模型级别,而methods的操作层次是在业务级别,这也对应了它们的权限控制级别.个人认为,在客户端直接进行CRUD操作(数据模型级别的操作),表面上灵活很多,但是很难进行权限控制,很容易暴露安全问题,并因此反而增加程序复杂度.因此,客户端对数据的修改,应该全部由methods进行一次业务级别的隔离. 当然,使用collection2或collec

mysql基本认识【关系型数据库和nosql、mysql操作流程和体系,库操作,表操作,数据的操作,字符集的操作,以及php作为client操作数据库】对连接本身没有疑问

1.关系型数据库永久性保存数据的仓库php的变量只是php脚本执行期间,临时性保存变量的空间[使用内存空间临时保存] 关系型数据库:利用二者的关系来描述实体的信息.[利用二维表字段名和字段值来进行描述][关系型数据库根本不是可以使用外键将两个表构建成关联的意思,而是实现描述实体的二维表的形式] nosql:not only sql[sql表示操作关系型数据的语言]所以nosql指的就是非关系型数据库[典型的是键值对型的数据(redis.memcache)][nosql可以视情况添加信息,不需要对

JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作

基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import java.io.IOException; /** * java标准IO(input/output)操作 * 输入流InputStrean:用于从数据源读取数据到程序中 * 输出流OutputStream:用于将数据发送至目标 * * 流划分为:节点流,处理流 * 节点流:又叫做低级流,特点:数据源明确,

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作)

iOS开发UI篇—自定义瀑布流控件(蘑菇街数据刷新操作) 一.简单说明 使用数据刷新框架: 该框架提供了两种刷新的方法,一个是使用block回调(存在循环引用问题,_ _weak),一个是使用调用. 问题:在进行下拉刷新之前,应该要清空之前的所有数据(在刷新数据这个方法中). 移除正在显示的cell: (1)把字典中的所有的值,都从屏幕上移除 (2)清除字典中的所有元素 (3)清除cell的frame,每个位置的cell的frame都要重新计算 (4)清除可复用的缓存池. 该部分的代码如下: 1

每篇半小时1天入门MongoDB——4.MongoDB索引介绍及数据库命令操作

准备工作 继续连接到mongo C:\Users\zouqi>mongo MongoDB shell version: 3.0.7 connecting to: test 查看数据库和集合 > show dbs demo 0.078GB local 0.078GB myDatabase 0.078GB myTest 0.078GB > use myTest switched to db myTest > show collections persons system.indexes

如何处理大量数据并发操作

文件缓存,数据库缓存,优化sql,数据分流,数据库表的横向和纵向划分,优化代码结构! 锁述的概 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用

利用数据集进行数据访问操作

数据访问有两种不同的方式,一种是用Connection, Command , DataReader来进行数据对数据的操作,另一种是用DataAdapter(适配器)来进行数据操作,而数据则一般放在内存中的数据集合DataSet,这种方式可以在内存中对数据操作,然后在合适的时间再将修改传到数据库. 一. 建立数据集: 1. 在解决方案右键添加新建项,找到数据中的数据集: 2. 在服务器资源管理器里数据连接添加连接: 3. 之后找到数据库里面需要用到的表,选中之后拖拽至右侧数据集里: 这样一个数据集

数据仓库,数据基础操作

1 /// <summary> 2 /// 此类作用:数据仓库,数据基础操作 3 /// </summary> 4 /// <typeparam name="TEntity">实体</typeparam> 5 /// <remarks> 6 /// zhangqc 2016.08.08 新建 7 /// </remarks> 8 public partial class Repository<TEntity&