数据据操作 tp5
数据库操作-DB类
学习手册
数据库配置
注意1:在TP里面,可以在模块下面单独的建立一个database.php配置文件,代表这个模块就使用配置的这个数据库
注意2:我们可以在config.php里面配置多个数据信息也是可以的
数据库操作-查询
先在控制器引入Db类
使用Db类的query方法即可
查询也可以使用占位符
数据库操作-增删改
使用Db类的execute方法
数据库切换
- 在application/config.php里面配置一个db1的数据库信息
- 使用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是对应的
基本操作-增加
完成数据的增加主要有如下几种方法
- 模型对象的save方法(先为对象设置属性)
- 模型类的create静态方法
- 模型对象的saveAll批量添加方法
实操:
1.模型对象的save方法(先为对象设置属性)
2.模型类的create静态方法【简化操作】
3.模型对象的saveAll批量添加方法【上面的两种操作,都只能完成单条数据的插入,如果批量插入数据,需要使用模型对象的saveAll方法】
基本操作-查看
查询数据主要有如下几种方法
- 模型类的get静态方法【存在返回值为对象,否则为null】
- 通过字段查询getByFieldname()方法
- 根据条件查询get(['username' => 'root'])
- where方法查询->find()
- where方法查询->select()
- 模型类的all静态方法和select静态方法
实操:
1.模型类的get静态方法【存在返回值为对象,否则为null】,通过传递主键获取数据
效果
2.根据条件查询get(['username' => 'root'])
方式一:
方式二:使用where方法传递(需要注意后面要通过find()方法调用一下)
3.通过模型对象的字段查询getByFieldname('查询条件')方法
- 模型类的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 |
|
1 |
caoyang |
admin88 |
gogery@163.com |
3 |
andy |
admin88 |
andy@sina.com |
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;
关联查询
- 建立用户表和履历表
- 创建User.php和Profile.php模型文件,并在User.php模型文件里面定义模型关联信息
履历表模型
- 查询关联信息
效果:
对于上面的操作,完全可以自己写sql完成
百度:链式操作
http://www.thinkphp.cn/topic/43233.html
关联添加
1. 完全可以自己去在代码里面完成,没必要依赖TP的关联模型。
- 使用Tp的关联模型进行数据的添加
一对多
简介
一对多的模型还是很常见的,一般解决方法就是增加一张附加表,然后在附加表里面增加一个关联字段。
常见:一个用户可以存在多本书籍。
sh_user表:
id |
username |
passsword |
|
1 |
caoyang |
admin88 |
gogery@163.com |
3 |
andy |
admin88 |
andy@sina.com |
sh_book表
id |
user_id |
img |
author |
title |
.... |
1 |
3 |
1.jpg |
莫言 |
分录肥臀 |
|
3 |
3 |
3.jpg |
西红柿 |
斗战 |
关联查询
- 创建book模型,并且在user模型里面定义关联关系
定义关系
- 构造测试数据
- 查询数据
关联添加
1. 不依赖TP的关联模型,自己手工的解决
- 使用Tp的关联模型完成
多对多
文档:https://www.kancloud.cn/manual/thinkphp5/142359
自动验证
相关文档:https://www.kancloud.cn/manual/thinkphp5/129319
场景:用户的添加的时候完成自动验证,在TP5里面可以使用多种方式完成验证操作。
验证类文件-方式一
- 在模块下建立一个validate目录,编写对应的验证类(类文件的名称和模型名称一致)
- 在控制器中使用模型对象的validate方法调用
效果
验证类文件-方式二
控制器验证-方式一
- 调用控制器的$this->validate(验证数据,验证类名称)方法
控制器验证-方式二
1.调用控制器的$this->validate(验证数据,验证的规则)方法
注意:验证通过返回true,否则返回错误的提示信息
注意:如果用户想自定义验证提示信息,则可以传递第三个参数
系统验证类的使用
在有的时候我们不希望自己定义验证类来处理,可以使用系统自带的Validate类进行验证
验证类的静态方法
演示
验证场景
TP里面使用了一种叫做验证场景的概念,针对不同的场合使用不同的验证,例如:在添加的时候有添加的验证规则;在更新的时候有更新的规则
表单验证
主要是为了防止外站提交(csrf攻击)
解决:
1. 在服务器返回表单信息的之前,生成一个唯一的密钥,然后在表单里面的隐藏域里面存放一下,同时还要把数据存到session里面一下。
2. 用户填完信息后,点击提交后,检测用户表单隐藏域里面的密钥和session里面的时候一样,一样则没有伪造提交(外站提交)
实现:
1. 在提交表单里面使用token()函数生成一个隐藏域
- 在自动验证里面进行验证
坑-dateFormat验证规则
在TP5如果需要验证某个时间数据,可以指定验证个还是,我们可以使用dateFormat规则,同时为其传递一个验证的规则字符串。
查看Validate底层的dateFormat方法
相关文档:
http://code.ziqiangxuetang.com/php/func-date-parse-from-format.html
SQL调试
本地调试模式开启
修改config.php配置文件即可
打印最后执行的sql
数据据操作 tp5的更多相关文章
- JAVASE02-Unit08: 文本数据IO操作 、 异常处理
Unit08: 文本数据IO操作 . 异常处理 * java.io.ObjectOutputStream * 对象输出流,作用是进行对象序列化 package day08; import java.i ...
- JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
基本IO操作 . 文本数据IO操作 java标准IO(input/output)操作 package day07; import java.io.FileOutputStream; import ja ...
- MySQL的数据库,数据表,数据的操作
数据库简介 概念 什么是数据库?简单来说,数据库就是存储数据的"仓库", 但是,光有数据还不行,还要管理数据的工具,我们称之为数据库管理系统! 数据库系统 = 数据库管理系统 + ...
- mysql数据表操作&库操作
首先登陆mysql:mysql -uroot -proot -P3306 -h127.0.0.1 查看所有的库:show databases; 进入一个库:use database; 显示所在的库:s ...
- 谈谈Delphi中的类和对象4---类是一种对数据和操作高度的封装机制 && 类是一种代码重用机制
五.类是一种对数据和操作高度的封装机制 1)数据封装 unit Unit2; interface type TEmployee = class; private FName: String; publ ...
- 背景:表A数据误操作,被delete了,恢复。
SELECT MAX(Scn) FROM Sys.Smon_Scn_Time WHERE Time_Dp < TO_DATE('2015-09-18', 'YYYY/MM/DD') select ...
- HealthKit开发快速入门教程之HealthKit数据的操作
HealthKit开发快速入门教程之HealthKit数据的操作 数据的表示 在HealthKit中,数据是最核心的元素.通过分析数据,人们可以看到相关的健康信息.例如,通过统计步数数据,人们可以知道 ...
- MongoDB源码分析——mongod数据查询操作
源码版本为MongoDB 2.6分支 Edit mongod数据查询操作 在mongod的初始化过程中说过,服务端接收到客户端消息后调用MyMessageHandler::process函数处理消息. ...
- 实现AT24C02的数据读写操作
/*************************************************************** 功能:11:32 2008-6-27 作者:SG 时间:2004-03 ...
随机推荐
- tarjan 割点 割边
by GeneralLiu tarjan 求 割点 割边 无向图 的 割点 割边: 对于无向连通图来说, 如果删除 一个点以及与它相连的边 之后, 使得这个图不连通, 那么该点为割点 : ...
- hihoCoder#1077 RMQ问题再临-线段树
原题地址 终于做到线段树的题了,因为建树.更新.查询都是递归操作,所以其实挺好写的. 用数组存的树,记得MAX_NODE开成两倍叶节点数大小,否则RE啊..不要问我是怎么知道的. 代码: #inclu ...
- bzoj1007 [HNOI2008]水平可见直线 - 几何 - hzwer.com
Description Input 第一行为N(0 < N < 50000),接下来的N行输入Ai,Bi Output 从小到大输出可见直线的编号,两两中间用空格隔开,最后一个数字后面也必 ...
- 牛客网小白月赛1 B,I
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> ...
- transaction transaction transaction 最大费用最大流转化到SPFA最长路
//当时比赛的时候没有想到可以用SPFA做,TLE! Problem Description Kelukin is a businessman. Every day, he travels aroun ...
- POJ 3268_Silver Cow Party
题意: n个地方,标号1~n,每个地方都有一头牛,现在要他们都去往标号为x的地方,再从x返回,每条道路都是单向的,求所有牛走的来回的最短路中的最大值. 分析: 注意在求每头牛走到x时,挨个算肯定超时, ...
- Office 针式打印机如何插入色带
1 打开盖子,用手按住我按的地方 2 向下翻起 3 翻转完成 4 装入色带(有旋钮的那面朝向自己,装入之后,按箭头方向旋转以拉紧色带,下图圈出来的2是色带导向架) 5 把色带绷直,如下 ...
- Solid Edge性质管理者 如何获取装配体的BOM表 物料清单
工具-性质管理者 在里面可以输入每个文件的文件号,版本号,作者等信息 右击点击显示性质,你还可以添加或删除文件属性 把需要的属性更改好了之后,可以输出装配体的所有零件信息到Excel中,点击工 ...
- ZOJ - 3471 Most Powerful (状态压缩)
题目大意:有n种原子,两种原子相碰撞的话就会产生能量,当中的一种原子会消失. 问这n种原子能产生的能量最大是多少 解题思路:用0表示该原子还没消失.1表示该原子已经消失.那么就能够得到状态转移方程了 ...
- paramiko_su_root
#coding=utf8 import paramiko import time import logging ''' if user root,can not login,must use user ...