文章目录
-
- 一. 下载资源文件
- 二. 模板变量应用
-
- 2.1 控制器文件
- 2.2 视图模板
- 2.3 修改后的视图文件
- 2.4 通过标签优化视图文件(标签循环,文件引入等)
- 三. 数据库创建
-
- 3.1 管理员表
- 3.2 商品分类表
- 3.3 商品表
- 3.4 菜单表
- 四. 查询构造器应用
-
- 4.1 查询
-
- table():设置表
- find():查询单个数据
- select():查询多个数据
- field():设置查询字段
- where():查询条件
- order() 与 limit()
- value():查询某个值
- column():查询某个列的值
- 4.2 插入
-
- insert():插入数据
- insertGetid():插入数据返回主键
- insertAll():插入多条数据
- 4.3 修改
-
- update():更新数据
- inc()与dec()
- 4.4 删除
-
- delete():删除数据
- useSoftDelete():软删除
- 4.5 其它操作
-
- save():同一写入数据
- 4.8 增删改查的一些进阶操作(链式操作)
-
- 数据表
- 表达式
- whire 链式
- 聚合查询
- 4.7 调试sql
- 4.8 多数据库配置(动态数据库配置)
- 五. 数据集
-
-
- isEmpty:是否为空
- isArray():转换为数组
- 5.1 利用数据库查询展现后台数据
-
- 六. 请求
-
- 6.1 param
- 6.2 GET请求
- 6.3 POST请求
- 6.4 请求类型
- 6.5 利用判断请求方法优化 edit 与 edis 方法,修改完后修改edit.html 的js方法
- 6.6 利用判断请求方法添加一个添加按钮
- 6.6 利用判断请求方法添加一个删除按钮
- 七. 模型
-
- 7.1 创建模型
- 7.2 模型操作
-
- find 查询数据
- 控制器调用模型
- 7.3 模型设置
- 7.4 模型作用
-
- 获取器
- 修改器
- 搜索器
- 检查数据
- 摘要
一个基于TP6的 单应用 学习项目 笔记
一. 下载资源文件
使用 layui ,下载并放 public 下资源目录下
二. 模板变量应用
根据控制器修改模板变量
2.1 控制器文件
<?php
namespace app\controller;use app\BaseController;
use think\facade\Db;
use think\facade\View;class Index extends BaseController
{
public function index(){
$title = '商城';$login = '欧阳克';$left = [['title' => '商品管理','lists' => [['id' => 1,'title' => '商品列表',],['id' => 2,'title' => '商品分类',]]],['title' => '用户管理','lists' => [['id' => 3,'title' => '用户列表',],['id' => 4,'title' => '购物车',],['id' => 5,'title' => '用户地址',],['id' => 6,'title' => '订单管理',]]],['title' => '后台管理','lists' => [['id' => 7,'title' => '管理员列表',],['id' => 8,'title' => '个人中心',],['id' => 9,'title' => '左侧菜单列',]]]];$right = [['id' => 1,'title' => '熙世界2019秋冬新款长袖杏色上衣连帽宽松刺绣文艺落肩袖加厚卫衣BF风','cat' => '女装','price' => 189,'discount' => 6,'status' => 1,// 'status' => '开启','add_time' => '2019-12-12',// 'add_time' => '1576080000'],['id' => 2,'title' => '秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女','cat' => '女装','price' => 699,'discount' => 7,'status' => 1,// 'status' => '开启','add_time' => '2019-12-12',// 'add_time' => '1576080000'],['id' => 3,'title' => '微弹中高腰直脚牛仔裤男','cat' => '男装','price' => 179,'discount' => 8,'status' => 2,// 'status' => '关闭','add_time' => '2019-12-12',// 'add_time' => '1576080000'],['id' => 1,'title' => '男士长袖t恤秋季圆领黑白体恤T 纯色上衣服打底衫','cat' => '男装','price' => 99,'discount' => 9,'status' => 1,// 'status' => '开启','add_time' => '2019-12-12',// 'add_time' => '1576080000'],];View::assign(['title' => $title,'login' => $login,'left' => $left,'right' => $right]);return View::fetch();}}
2.2 视图模板
<!DOCTYPE html>
<html>
<head><title>列表页</title><link rel="stylesheet" type="text/css" href="layui/css/layui.css"><script type="text/javascript" src="layui/layui.js"></script><style type="text/css">.header{
width:100%;height: 50px;line-height: 50px;background: #2e6da4;color:#ffffff;}.title{
margin-left: 20px;font-size: 20px;}.userinfo{
float: right;margin-right: 10px;}.userinfo a{
color:#ffffff;}.menu{
width: 200px;background:#333744;position:absolute;}.main{
position: absolute;left:200px;right:0px;}.layui-collapse{
border: none;}.layui-colla-item{
border-top:none;}.layui-colla-title{
background:#42485b;color:#ffffff;}.layui-colla-content{
border-top:none;padding:0px;}.content span{
background: #009688;margin-left: 30px;padding: 10px;color:#ffffff;}.content div{
border-bottom: solid 2px #009688;margin-top: 8px;}.content button{
float: right;margin-top: -5px;}</style>
</head>
<body><div class="header"><span class="title"><span style="font-size: 20px;">XXX</span>--后台管理系统</span><span class="userinfo">【欧阳克】<span><a href="javascript:;">退出</a></span></span></div><div class="menu" id="menu"><div class="layui-collapse" lay-accordion><div class="layui-colla-item"><h2 class="layui-colla-title">商城管理</h2><div class="layui-colla-content layui-show"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li></ul></div></div><div class="layui-colla-item"><h2 class="layui-colla-title">商城管理</h2><div class="layui-colla-content"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li></ul></div></div><div class="layui-colla-item"><h2 class="layui-colla-title">商城管理</h2><div class="layui-colla-content"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li><li class="layui-nav-item"><a href="list.html">商品列表</a></li></ul></div></div></div></div><div class="main" style="padding:10px;"><div class="content"><span>商品列表</span><div></div></div><table class="layui-table"><thead><tr><th>ID</th><th>商品标题</th><th>分类</th><th>价格</th><th>状态</th><th>添加时间</th></tr></thead><tbody><tr><td>1</td><td>熙世界2019秋冬新款长袖杏色上衣连帽宽松刺绣文艺落肩袖加厚卫衣BF风</td><td>女装</td><td>189</td><td>开启</td><td>2019-12-12</td></tr><tr><td>2</td><td>秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女</td><td>女装</td><td>699</td><td>开启</td><td>2019-12-12</td></tr><tr><td>3</td><td>秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女</td><td>女装</td><td>699</td><td>开启</td><td>2019-12-12</td></tr><tr><td>4</td><td>秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女</td><td>女装</td><td>699</td><td>开启</td><td>2019-12-12</td></tr><tr><td>5</td><td>秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女</td><td>女装</td><td>699</td><td>关闭</td><td>2019-12-12</td></tr><tr><td>6</td><td>秋水伊人双面呢冬装2019年新款女装气质西装领撞色羊毛大衣外套女</td><td>女装</td><td>699</td><td>开启</td><td>2019-12-12</td></tr></tbody></table></div>
</body>
</html>
<script>layui.use(['element','layer','laypage'], function(){
var element = layui.element;var laypage = layui.laypage;$ = layui.jquery;layer = layui.layer;resetMenuHeight();});// 重新设置菜单容器高度function resetMenuHeight(){
var height = document.documentElement.clientHeight - 50;$('#menu').height(height);} </script>
2.3 修改后的视图文件
根据控制器的样式修改视图模板
左侧商品管理
修改右侧商品列表
<!DOCTYPE html>
<html>
<head><title>列表页</title><link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css"><script type="text/javascript" src="/static/layui/layui.js"></script><style type="text/css">.header{
width:100%;height: 50px;line-height: 50px;background: #2e6da4;color:#ffffff;}.title{
margin-left: 20px;font-size: 20px;}.userinfo{
float: right;margin-right: 10px;}.userinfo a{
color:#ffffff;}.menu{
width: 200px;background:#333744;position:absolute;}.main{
position: absolute;left:200px;right:0px;}.layui-collapse{
border: none;}.layui-colla-item{
border-top:none;}.layui-colla-title{
background:#42485b;color:#ffffff;}.layui-colla-content{
border-top:none;padding:0px;}.content span{
background: #009688;margin-left: 30px;padding: 10px;color:#ffffff;}.content div{
border-bottom: solid 2px #009688;margin-top: 8px;}.content button{
float: right;margin-top: -5px;}</style>
</head>
<body>
<div class="header"><span class="title"><span style="font-size: 20px;">{$title}</span>--后台管理系统</span><span class="userinfo">【{$login}】<span><a href="javascript:;">退出</a></span></span>
</div>
<div class="menu" id="menu"><div class="layui-collapse" lay-accordion><div class="layui-colla-item"><h2 class="layui-colla-title">{$left[0]['title']}</h2><div class="layui-colla-content layui-show"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">{$left[0]['lists'][0]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[0]['lists'][1]['title']}</a></li></ul></div></div><div class="layui-colla-item"><h2 class="layui-colla-title">{$left[1]['title']}</h2><div class="layui-colla-content"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">{$left[1]['lists'][0]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[1]['lists'][1]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[1]['lists'][2]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[1]['lists'][3]['title']}</a></li></ul></div></div><div class="layui-colla-item"><h2 class="layui-colla-title">{$left[2]['title']}</h2><div class="layui-colla-content"><ul class="layui-nav layui-nav-tree" lay-filter="test"><li class="layui-nav-item"><a href="list.html">{$left[2]['lists'][0]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[2]['lists'][1]['title']}</a></li><li class="layui-nav-item"><a href="list.html">{$left[2]['lists'][2]['title']}</a></li></ul></div></div></div>
</div>
<div class="main" style="padding:10px;"><div class="content"><span>商品列表</span><div></div></div><table class="layui-table"><thead><tr><th>ID</th><th>商品标题</th><th>分类</th><th>价格</th><th>状态</th><th>添加时间</th></tr></thead><tbody><tr><td>{$right[0]['id']}</td><td>{$right[0]['title']}</td><td>{$right[0]['cat']}</td><td>{$right[0]['price']}</td><td>{$right[0]['status']}</td><td>{$right[0]['add_time']}</td></tr><tr><td>{$right[1]['id']}</td><td>{$right[1]['title']}</td><td>{$right[1]['cat']}</td><td>{$right[1]['price']}</td><td>{$right[1]['status']}</td><td>{$right[1]['add_time']}</td></tr><tr><td>{$right[2]['id']}</td><td>{$right[2]['title']}</td><td>{$right[2]['cat']}</td><td>{$right[2]['price']}</td><td>{$right[2]['status']}</td><td>{$right[2]['add_time']}</td></tr><tr><td>{$right[3]['id']}</td><td>{$right[3]['title']}</td><td>{$right[3]['cat']}</td><td>{$right[3]['price']}</td><td>{$right[3]['status']}</td><td>{$right[3]['add_time']}</td></tr></tbody></table>
</div>
</body>
</html>
<script>layui.use(['element','layer','laypage'], function(){
var element = layui.element;var laypage = layui.laypage;$ = layui.jquery;layer = layui.layer;resetMenuHeight();});// 重新设置菜单容器高度function resetMenuHeight(){
var height = document.documentElement.clientHeight - 50;$('#menu').height(height);} </script>
2.4 通过标签优化视图文件(标签循环,文件引入等)
在视图目录下创建一个public目录,将 index.html 视图文件的头与尾 取出来做公共文件
,header.html 引入js,css文件,index.html 引入 头尾 文件。
header.html 文件
<html>
<head><title>列表页</title>{load href="/static/layui/css/layui.css"}{load href="/static/layui/layui.js"}<style type="text/css">.header{
width:100%;height: 50px;line-height: 50px;background: #2e6da4;color:#ffffff;}.title{
margin-left: 20px;font-size: 20px;}.userinfo{
float: rght;margin-right: 10px;}.userinfo a{
color:#ffffff;}.menu{
width: 200px;background:#333744;position:absolute;}.main{
position: absolute;left:200px;right:0px;}.layui-collapse{
border: none;}.layui-colla-item{
border-top:none;}.layui-colla-title{
background:#42485b;color:#ffffff;}.layui-colla-content{
border-top:none;padding:0px;}.content span{
background: #009688;margin-left: 30px;padding: 10px;color:#ffffff;}.content div{
border-bottom: solid 2px #009688;margin-top: 8px;}.content button{
float: right;margin-top: -5px;}</style>
</head>
<body>
tail.html 文件
</body>
</html>
<script>layui.use(['element','layer','laypage'], function(){
var element = layui.element;var laypage = layui.laypage;$ = layui.jquery;layer = layui.layer;resetMenuHeight();});// 重新设置菜单容器高度function resetMenuHeight(){
var height = document.documentElement.clientHeight - 50;$('#menu').height(height);} </script>
index.php 新增一个打折功能,并引入header与 tail
{include file="public/header"}
<div class="header"><span class="title"><span style="font-size: 20px;">{if $title}{$title} {/if}</span>--后台管理系统</span><span class="userinfo">【{$login}】<span><a href="javascript:;">退出</a></span></span>
</div>
<div class="menu" id="menu"><div class="layui-collapse" lay-accordion>{foreach $left as $k=>$v}<div class="layui-colla-item"><h2 class="layui-colla-title">{$v['title']}</h2><div class="layui-colla-content {if $k == 0}layui-show{/if}"><ul class="layui-nav layui-nav-tree" lay-filter="test">{foreach $v['lists'] as $vv}<li class="layui-nav-item"><a href="list.html">{$vv['title']}</a></li>{/foreach}</ul></div></div>{/foreach}</div>
</div>
<div class="main" style="padding:10px;"><div class="content"><span>商品列表</span><div></div></div><table class="layui-table"><thead><tr><th>ID</th><th>商品标题</th><th>分类</th><th>原价</th><th>现价</th><th>状态</th><th>添加时间</th></tr></thead><tbody>{volist name="right" id="rr"}<tr><td>{$rr['id']}</td><td>{$rr['title']}</td><td>{$rr['cat']}</td><td>{$rr['price']}</td><td>{if $rr['discount']!=0}{$rr['price']*($rr['discount']/10)}{else /}{$rr['price']}{/if}</td><td>{if $rr['status']==1}开启{elseif $rr['status']==0/}关闭{/if}</td><td>{$rr['add_time']|date='Y-m-d H:i:s'}</td></tr>{/volist}</tbody></table>
</div>
{include file="public/tail"}
三. 数据库创建
创建数据库与表,此数据库为项目数据库。
3.1 管理员表
CREATE TABLE `shop_admin` (`uid` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',`account` varchar(50) NOT NULL COMMENT '账户',`password` char(32) NOT NULL COMMENT '密码',`name` varchar(50) NOT NULL COMMENT '姓名',`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1开启 2关闭',`add_time` int(10) unsigned NOT NULL COMMENT '添加时间',PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='后台管理员';
INSERT INTO `shop_admin` VALUES (1, 'ouyangke', 'e10adc3949ba59abbe56e057f20f883e', '欧阳克', 1, 1576080000);
3.2 商品分类表
CREATE TABLE `shop_cat` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`name` varchar(50) NOT NULL COMMENT '分类名',`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1开启 2关闭',PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='分类表';INSERT INTO `shop_cat` VALUES (1, '女装', 1);
INSERT INTO `shop_cat` VALUES (2, '男装', 1);
INSERT INTO `shop_cat` VALUES (3, '孕产', 1);
INSERT INTO `shop_cat` VALUES (4, '童装', 1);
INSERT INTO `shop_cat` VALUES (5, '电视', 1);
INSERT INTO `shop_cat` VALUES (6, '手机', 1);
INSERT INTO `shop_cat` VALUES (7, '电脑', 1);
3.3 商品表
CREATE TABLE `shop_goods` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ' 商品ID',`cat` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '分类ID',`title` varchar(200) NOT NULL COMMENT '商品标题',`price` double(10,2) unsigned NOT NULL COMMENT '价格',`discount` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '折扣',`stock` int(10) unsigned NOT NULL DEFAULT '1' COMMENT '库存',`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1开启 2关闭 3删除',`add_time` int(10) unsigned NOT NULL COMMENT '添加时间',PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=20 DEFAULT CHARSET=utf8mb4 COMMENT='商品表';INSERT INTO `shop_goods` VALUES (1, 1, '云朵般轻盈的仙女裙 高级钉珠收腰长裙 气质无袖连衣裙', 279.99, 0, 1100, 1, 1576080000);
INSERT INTO `shop_goods` VALUES (2, 1, '高冷御姐风灯芯绒a字连衣裙女秋冬2019年新款收腰显瘦复古裙子', 255.90, 0, 100, 1, 1576080000);
3.4 菜单表
CREATE TABLE `shop_menu` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',`title` varchar(50) NOT NULL COMMENT '菜单名',`fid` int(10) NOT NULL COMMENT '父ID',`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1开启 2关闭',PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='左侧菜单表';INSERT INTO `shop_menu` VALUES (1, '商品管理', 0, 1);
INSERT INTO `shop_menu` VALUES (2, '商品列表', 1, 1);
INSERT INTO `shop_menu` VALUES (3, '商品分类', 1, 1);
INSERT INTO `shop_menu` VALUES (4, '用户管理', 0, 1);
INSERT INTO `shop_menu` VALUES (5, '用户列表', 4, 1);
INSERT INTO `shop_menu` VALUES (6, '购物车', 4, 1);
INSERT INTO `shop_menu` VALUES (7, '用户地址', 4, 1);
INSERT INTO `shop_menu` VALUES (8, '订单管理', 4, 1);
INSERT INTO `shop_menu` VALUES (9, '后台管理', 0, 1);
INSERT INTO `shop_menu` VALUES (10, '管理员列表', 9, 1);
INSERT INTO `shop_menu` VALUES (11, '个人中心', 9, 1);
INSERT INTO `shop_menu` VALUES (12, '左侧菜单', 9, 1);
四. 查询构造器应用
thinkphp6 默认操作数据库采用 PDO 处理方式
统一操作入口:Db::
原生查询:query(),execute()
常用构造器:table(),field(),find(),select(),where(),order()
ps:
V6.0.3+版本开始,原生查询仅支持Db类操作,不支持在模型中调用原生查询方法(包括query和execute方法)。
创建一个数据库,包括一个表,几个字段,不使用前面创建的项目数据库。
4.1 查询
table():设置表
find():查询单个数据
参数可加条件,默认主键
public function demo1(){
$res = Db::table('tp_user')->find(2);dump($res);
select():查询多个数据
也支持主键为参数
public function demo1(){
$res = Db::table('tp_user')->select();dump($res);
如果查询的条件有多个参数,可将参数放在数组中查询
field():设置查询字段
public function demo1(){
$res = Db::table('tp_user')->field('user_id,user_name')->select();dump($res);
where():查询条件
支持字符串,表达式,数组
public function demo1(){
$res = Db::table('tp_user')->field('user_id,user_name')->where('user_id >= 1')->select();dump($res);
order() 与 limit()
排序与查询数量
多个排序规则放数组中进行
order 默认为升序
public function demo1(){
$res = Db::table('tp_user')->field('user_id,user_name')->order('user_id')->select();dump($res);
降序为 desc 与mysql一致
public function demo1(){
$res = Db::table('tp_user')->field('user_id,user_name')->order('user_id','desc')->select();dump($res);
limit 指定输出数量
public function demo1(){
$res = Db::table('tp_user')->field('user_id,user_name')->order('user_id','desc')->limit('1')->select();dump($res);
value():查询某个值
public function demo1(){
$res = Db::table('tp_user')->value('user_name');dump($res);
column():查询某个列的值
public function demo1(){
$res = Db::table('tp_user')->column('user_name');dump($res);
4.2 插入
insert():插入数据
返回 数值 1
public function demo1(){
$data = ['user_name' =>'wpsec','password'=>md5('wpsec')];$ins = Db::table('tp_user')->insert($data);dump($ins);
insertGetid():插入数据返回主键
public function demo1(){
$data = ['user_name' =>'wpsec1','password'=>md5('wpsec')];$ins = Db::table('tp_user')->insertGetId($data);dump($ins);
insertAll():插入多条数据
public function demo1(){
$data =[['user_name' =>'wpsec2','password'=>md5('wpsec2')],['user_name' =>'wpsec3','password'=>md5('wpsec3')]];dump($data);$ins = Db::table('tp_user')->insertAll($data);dump($ins);
4.3 修改
update():更新数据
public function demo1(){
$data =['password' => md5('123456')];$update = Db::table('tp_user')->where('user_id = 4')->update($data);dump($update);
inc()与dec()
自增与自减
从上个数值+1 或 -1
第二参数为步长(默认1)
public function demo1(){
$update = Db::table('tp_user')->where('user_id = 4')->inc('user_id',2)->update());dump($update);
4.4 删除
delete():删除数据
public function demo1(){
$delete = Db::table('tp_user')->where('user_id = 6')->delete();dump($delete);
useSoftDelete():软删除
数据没有被真正删除,使用 delete_time 或者 status 将数据标记。
4.5 其它操作
save():同一写入数据
自动判断是否是修改还是插入(以写入数据中是否存在主键为依据)
插入数据
public function demo1(){
$data = ['user_name' => 'cqcet','password' => md5('123'),'email' => 'cqcet@admin.com'];$save = Db::table('tp_user')->save($data);dump($save);
修改数据
public function demo1(){
$data = ['user_id' => '5','user_name' => 'cqucc','password' => md5('123'),'email' => 'cqucc@admin.com'];$save = Db::table('tp_user')->save($data);dump($save);
4.8 增删改查的一些进阶操作(链式操作)
数据表
# 必须完整数据库名
$select = Db::table('shop_goods')->where('id','10')->select();
print_r($select->toArray());
# 数据库未设置前缀
$select = Db::name('shop_goods')->where('id','11')->select();
print_r($select->toArray());
# 数据库设置前缀,无前缀访问
$select = Db::name('list')->where('id','12')->select();
print_r($select->toArray());
数据表前缀
database.php
return ['connections' => ['mysql' => [// 数据库表前缀'prefix' => Env::get('database.prefix', 'shop_'),]]
];
连贯操作 | 作用 | 支持的参数类型 |
---|---|---|
where* | 用于AND查询 | 字符串、数组和对象 |
table | 用于定义要操作的数据表名称 | 字符串和数组 |
name | 用于定义要操作的数据表名称 | 字符串 |
field* | 用于定义要查询的字段(支持字段排除) | 字符串和数组 |
order* | 用于对结果排序 | 字符串和数组 |
limit | 用于限制查询结果数量 | 字符串和数字 |
page | 用于查询分页(内部会转换成limit) | 字符串和数字 |
whereOr* | 用于OR查询 | 字符串、数组和对象 |
whereTime* | 用于时间日期的快捷查询 | 字符串 |
alias | 用于给当前数据表定义别名 | 字符串 |
group | 用于对查询的group支持 | 字符串 |
having | 用于对查询的having支持 | 字符串 |
join* | 用于对查询的join支持 | 字符串和数组 |
union* | 用于对查询的union支持 | 字符串、数组和对象 |
view* | 用于视图查询 | 字符串、数组 |
distinct | 用于查询的distinct支持 | 布尔值 |
lock | 用于数据库的锁机制 | 布尔值 |
cache | 用于查询缓存 | 支持多个参数 |
comment | 用于SQL注释 | 字符串 |
force | 用于数据集的强制索引 | 字符串 |
master | 用于设置主服务器读取数据 | 布尔值 |
strict | 用于设置是否严格检测字段名是否存在 | 布尔值 |
sequence | 用于设置自增序列名 | 字符串 |
failException | 用于设置没有查询到数据是否抛出异常 | 布尔值 |
partition | 用于设置分区信息 | 数组 字符串 |
replace | 用于设置使用REPLACE方式写入 | 布尔值 |
extra | 用于设置额外查询规则 | 字符串 |
duplicate | 用于设置DUPLCATE信息 | 数组 字符串 |
表达式
- 表达式是SQL语句的条件
- 表达式不分大小写
- 表达式写在where里
表达式 | 含义 | 方法 |
---|---|---|
= | 等于 | |
<> | 不等于 | |
> | 大于 | |
>= | 大于等于 | |
< | 小于 | |
<= | 小于等于 | |
[NOT] LIKE | 模糊查询 | whereLike/whereNotLike |
[NOT] BETWEEN | (不在)区间查询 | whereBetween/whereNotBetween |
[NOT] IN | (不在)IN 查询 | whereIn/whereNotIn |
[NOT] NULL | 查询字段是否(不)是NULL | whereNull/whereNotNull |
whire 链式
# 等于(=)
$select = Db::table('shop_goods')->where('id','=','1')->select();
print_r($select->toArray());# 不等于(<>)
$select = Db::table('shop_goods')->where('id','<>','2')->select();
print_r($select->toArray());# 大于(>)
$select = Db::table('shop_goods')->where('id','>','3')->select();
print_r($select->toArray());# 大于等于(>=)
$select = Db::table('shop_goods')->where('id','>=','4')->select();
print_r($select->toArray());# 小于(<)
$select = Db::table('shop_goods')->where('id','<','5')->select();
print_r($select->toArray());# 小于等于(<=)
$select = Db::table('shop_goods')->where('id','<=','6')->select();
print_r($select->toArray());# 多where
$select = Db::table('shop_goods')->where('id','>','3')->where('id','<','8')->select();
print_r($select->toArray());# LIKE
$select = Db::table('shop_goods')->where('title','like','%连衣裙%')->select();
print_r($select->toArray());# NOT LIKE
$select = Db::table('shop_goods')->where('title','not like','%连衣裙%')->select();
print_r($select->toArray());# BETWEEN
$select = Db::table('shop_goods')->where('id','between','6,10')->select();
print_r($select->toArray());# NOT BETWEEN
$select = Db::table('shop_goods')->where('id','not between',[6,10])->select();
print_r($select->toArray());# IN
$select = Db::table('shop_goods')->where('id','in','4,7,10')->select();
print_r($select->toArray());# NOT IN
$select = Db::table('shop_goods')->where('id','not in',[4,7,10])->select();
print_r($select->toArray());
聚合查询
- 聚合方法如果没有数据,默认都是0,聚合查询都可以配合其它查询条件
方法 | 功能 |
---|---|
count | 统计数量,参数是要统计的字段名(可选) |
max | 获取最大值,参数是要统计的字段名(必须) |
min | 获取最小值,参数是要统计的字段名(必须) |
avg | 获取平均值,参数是要统计的字段名(必须) |
sum | 获取总数,参数是要统计的字段名(必须) |
// 统计数量,参数是要统计的字段名(可选)
$select = Db::table('shop_goods')->count();
print_r($select);// 获取最大值,参数是要统计的字段名(必须)
$select = Db::table('shop_goods')->max('id');
print_r($select);// 获取最小值,参数是要统计的字段名(必须)
$select = Db::table('shop_goods')->min('id');
print_r($select);// 获取平均值,参数是要统计的字段名(必须)
$select = Db::table('shop_goods')->avg('id');
print_r($select);// 获取总数,参数是要统计的字段名(必须)
$select = Db::table('shop_goods')->sum('id');
print_r($select);
4.7 调试sql
- getLastSql():输出上次执行的sql语句,只能获取最后执行的sql语句。
- fetchSql():方法直接返回当前sql而不执行。
public function test(){
$info = Db::table('shop_goods')->where('id','1')->fetchSql()->select();echo Db::getLastSql()."</br>";echo $info;}
4.8 多数据库配置(动态数据库配置)
配置两个数据库配置信息
在database.php 下可配置多个数据库配置信息
五. 数据集
处理数据集的方法
常用的 isEmpty,toArray
方法 | 描述 |
---|---|
isEmpty | 是否为空 |
toArray | 转换为数组 |
all | 所有数据 |
merge | 合并其它数据 |
diff | 比较数组,返回差集 |
flip | 交换数据中的键和值 |
intersect | 比较数组,返回交集 |
keys | 返回数据中的所有键名 |
pop | 删除数据中的最后一个元素 |
shift | 删除数据中的第一个元素 |
unshift | 在数据开头插入一个元素 |
push | 在结尾插入一个元素 |
reduce | 通过使用用户自定义函数,以字符串返回数组 |
reverse | 数据倒序重排 |
chunk | 数据分隔为多个数据块 |
each | 给数据的每个元素执行回调 |
filter | 用回调函数过滤数据中的元素 |
column | 返回数据中的指定列 |
sort | 对数据排序 |
order | 指定字段排序 |
shuffle | 将数据打乱 |
slice | 截取数据中的一部分 |
map | 用回调函数处理数组中的元素 |
where | 根据字段条件过滤数组中的元素 |
whereLike | Like查询过滤元素 |
whereNotLike | Not Like过滤元素 |
whereIn | IN查询过滤数组中的元素 |
whereNotIn | Not IN查询过滤数组中的元素 |
whereBetween | Between查询过滤数组中的元素 |
whereNotBetween | Not Between查询过滤数组中的元素 |
isEmpty:是否为空
public function demo1(){
$res = Db::table('tp_user')->where('user_id = 100')->select();if ($res->isEmpty()) {
echo '没有数据';}
isArray():转换为数组
public function demo1(){
$res = Db::table('tp_user')->select()->toArray();dump($res);
5.1 利用数据库查询展现后台数据
修改控制器
public function index(){
$title = '煌煌商城';$login = '惶惶';$left = Db::table('shop_menu')->where('fid',0)->select();$left = $left->toArray();foreach($left as &$left_v){
$left_v['lists'] = Db::table('shop_menu')->where('fid',$left_v['id'])->select();}$right = Db::table('shop_goods')->select();$right = $right->toArray();foreach($right as &$right_v){
$right_v['cat'] = Db::table('shop_cat')->where('id',$right_v['cat'])->value('name');}View::assign(['title' => $title,'login' => $login,'left' => $left,'right' => $right]);return View::fetch();}
六. 请求
- 使用请求必须使用门面方式调用(think\facade\Requert)
- 通过Request对象完成全局输入变量的检测,获取和安全过滤
- 支持
get,post,request,server,session,cookie,env
等超全局变量和文件上传信息
方法 | 描述 |
---|---|
param | 获取当前请求的变量 |
get | 获取 $_GET 变量 |
post | 获取 $_POST 变量 |
put | 获取 PUT 变量 |
delete | 获取 DELETE 变量 |
session | 获取 SESSION 变量 |
cookie | 获取 $_COOKIE 变量 |
request | 获取 $_REQUEST 变量 |
server | 获取 $_SERVER 变量 |
env | 获取 $_ENV 变量 |
route | 获取 路由(包括PATHINFO) 变量 |
middleware | 获取 中间件赋值/传递的变量 |
file | 获取 $_FILES 变量 |
all V6.0.8+ | 获取包括 $_FILES 变量在内的请求变量,相当于param+file |
6.1 param
param 可以获取所有请求方法(自动识别),系统推荐使用此方法
param 会把当前请求类型的参数和路由变量以及get请求合并,并且路由变量是优先的
(请求一个网页时,param会把请求的参数和路由合并为一个数组)
6.2 GET请求
视图文件
添加一个操作
插入一条onclick与js
...
<th>操作</th>
...
<td><button class="layui-btn layui-btn-xs" onclick="edit({$rr.id})">编辑</button></td>
...<button class="layui-btn layui-btn-xs" onclick="edit({$right_v.id})">编辑</button><script type="text/javascript">function edit(id){
layer.open({
type: 2,title: '修改',shade: 0.3,area: ['480px', '440px'],content: '/index.php/index/edit?id='+id});} </script>
控制器文件
public function edit(){
print_r( $_GET ); // 原生get接收print_r( Request::param() ); // 获取当前请求的所有变量print_r( Request::param('id') ); // 获取当前请求的id变量print_r( Request::get() );
}
创建 edit.html 前端代码
<!DOCTYPE html>
<html>
<head><title></title><link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css"><script type="text/javascript" src="/static/layui/layui.js"></script>
</head>
<body style="padding:10px;">
<form class="layui-form"><input type="hidden" name="id" value="{$shop.id}"><div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-inline"><input type="text" class="layui-input" name="title" value="{$shop.title}"></div></div><div class="layui-form-item"><label class="layui-form-label">分类</label><div class="layui-input-inline"><select name="cat"><option value=0 selected ></option><option value=0> </option></select></div></div><div class="layui-form-item"><label class="layui-form-label">原价</label><div class="layui-input-inline"><input type="text" class="layui-input" name="price" value="{$shop.price}"></div></div><div class="layui-form-item"><label class="layui-form-label">折扣</label><div class="layui-input-inline"><input type="text" class="layui-input" name="discount" value="{$shop.discount}"></div></div><div class="layui-form-item"><label class="layui-form-label">库存</label><div class="layui-input-inline"><input type="text" class="layui-input" name="stock" value="{$shop.stock}"></div></div><div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-inline"><select name="status"><option value="1"> </option><option value="0"></option></select></div></div>
</form>
<div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" onclick="save()">保存</button></div>
</div>
<script type="text/javascript">layui.use(['layer','form'],function(){
form = layui.form;layer = layui.layer;$ = layui.jquery;});function save(){
$.post('/index.php/Index/edits',$('form').serialize(),function(res){
if(res.code>0){
layer.alert(res.msg,{
icon:2});}else{
layer.msg(res.msg);setTimeout(function(){
parent.window.location.reload();},1000);}},'json');} </script>
</body>
</html>
修改 控制器文件中的 edit 方法
public function edit(){
$id = Request::param('id');$shop = Db::table('shop_goods')->where('id',$id)->find();View::assign(['shop' => $shop]);return View::fetch();}
修改edit 与 控制器 把 商品分类表查询出来(shop_cat表)
public function edit(){
$id = Request::param('id');$shop = Db::table('shop_goods')->where('id',$id)->find();$cat = Db::table('shop_cat')->where('status',1)->select();View::assign(['shop' => $shop,'cat' => $cat]);return View::fetch();}
edit.html
<!DOCTYPE html>
<html>
<head><title></title><link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css"><script type="text/javascript" src="/static/layui/layui.js"></script>
</head>
<body style="padding:10px;">
<form class="layui-form"><input type="hidden" name="id" value="{$shop.id}"><div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-inline"><input type="text" class="layui-input" name="title" value="{$shop.title}"></div></div><div class="layui-form-item"><label class="layui-form-label">分类</label><div class="layui-input-inline"><select name="cat"><option value=0 {if $shop['cat']==0} selected {/if}></option>{volist name="cat" id="cat_v"}<option value="{$cat_v['id']}" {if $shop['cat']==$cat_v['id']} selected {/if}>{$cat_v['name']}</option>{/volist}</select></div></div><div class="layui-form-item"><label class="layui-form-label">原价</label><div class="layui-input-inline"><input type="text" class="layui-input" name="price" value="{$shop.price}"></div></div><div class="layui-form-item"><label class="layui-form-label">折扣</label><div class="layui-input-inline"><input type="text" class="layui-input" name="discount" value="{$shop.discount}"></div></div><div class="layui-form-item"><label class="layui-form-label">库存</label><div class="layui-input-inline"><input type="text" class="layui-input" name="stock" value="{$shop.stock}"></div></div><div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-inline"><select name="status"><option value="1" {if $shop['status']==1} selected {/if}>开启</option><option value="0" {if $shop['status']==0} selected {/if}>关闭</option></select></div></div>
</form>
<div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" onclick="save()">保存</button></div>
</div>
<script type="text/javascript">layui.use(['layer','form'],function(){
form = layui.form;layer = layui.layer;$ = layui.jquery;});function save(){
$.post('Index/edits',$('form').serialize(),function(res){
if(res.code>0){
layer.alert(res.msg,{
icon:2});}else{
layer.msg(res.msg);setTimeout(function(){
parent.window.location.reload();},1000);}},'json');} </script>
</body>
</html>
6.3 POST请求
edit.html 有一个保存的方法是通过 POST执行的
在控制器中创建edits方法
public function edits(){
$all = Request::param();$update = Db::table('shop_goods')->where('id',$all['id'])->update($all);if($update){
echo json_encode(['code'=>0,'msg'=>'修改成功']);}else{
echo json_encode(['code'=>1,'msg'=>'修改失败']);
6.4 请求类型
方法 | 说明 |
---|---|
method | 获取当前请求类型 |
has | 判断传值是否存在 |
isGet | 判断是否GET请求 |
isPost | 判断是否POST请求 |
isPut | 判断是否PUT请求 |
isDelete | 判断是否DELETE请求 |
isAjax | 判断是否AJAX请求 |
isPjax | 判断是否PJAX请求 |
isJson | 判断是否JSON请求 |
isMobile | 判断是否手机访问 |
isHead | 判断是否HEAD请求 |
isPatch | 判断是否PATCH请求 |
isOptions | 判断是否OPTIONS请求 |
isCli | 判断是否为CLI执行 |
isCgi | 判断是否为CGI模式 |
6.5 利用判断请求方法优化 edit 与 edis 方法,修改完后修改edit.html 的js方法
public function edit(){
if (Request::method() == "GET") {
$id = Request::param('id');$shop = Db::table('shop_goods')->where('id', $id)->find();$cat = Db::table('shop_cat')->where('status', 1)->select();View::assign(['shop' => $shop,'cat' => $cat]);return View::fetch();} elseif (Request::method() == "POST") {
$all = Request::param();$update = Db::table('shop_goods')->where('id', $all['id'])->update($all);if ($update) {
echo json_encode(['code' => 0, 'msg' => '修改成功']);} else {
echo json_encode(['code' => 1, 'msg' => '修改失败']);}} else {
echo json_encode(['code' => 1, 'msg' => '操作错误']);}
// return View::fetch();}
6.6 利用判断请求方法添加一个添加按钮
新建一个 add.html
<!DOCTYPE html>
<html>
<head><title></title><link rel="stylesheet" type="text/css" href="/static/layui/css/layui.css"><script type="text/javascript" src="/static/layui/layui.js"></script>
</head>
<body style="padding:10px;">
<form class="layui-form"><div class="layui-form-item"><label class="layui-form-label">标题</label><div class="layui-input-inline"><input type="text" class="layui-input" name="title" value=""></div></div><div class="layui-form-item"><label class="layui-form-label">分类</label><div class="layui-input-inline"><select name="cat"><option value=0 selected></option>{volist name="cat" id="cat_v"}<option value="{$cat_v['id']}">{$cat_v['name']}</option>{/volist}</select></div></div><div class="layui-form-item"><label class="layui-form-label">原价</label><div class="layui-input-inline"><input type="text" class="layui-input" name="price" value=""></div></div><div class="layui-form-item"><label class="layui-form-label">折扣</label><div class="layui-input-inline"><input type="text" class="layui-input" name="discount" value=""></div></div><div class="layui-form-item"><label class="layui-form-label">库存</label><div class="layui-input-inline"><input type="text" class="layui-input" name="stock" value=""></div></div><div class="layui-form-item"><label class="layui-form-label">状态</label><div class="layui-input-inline"><select name="status"><option value="1" selected>开启</option><option value="0">关闭</option></select></div></div>
</form>
<div class="layui-form-item"><div class="layui-input-block"><button class="layui-btn" onclick="save()">保存</button></div>
</div>
<script type="text/javascript">layui.use(['layer','form'],function(){
form = layui.form;layer = layui.layer;$ = layui.jquery;});function save(){
$.post('/Index/add',$('form').serialize(),function(res){
if(res.code>0){
layer.alert(res.msg,{
icon:2});}else{
layer.msg(res.msg);setTimeout(function(){
parent.window.location.reload();},1000);}},'json');} </script>
</body>
</html>
在index.html下新建一个 js 与添加按钮
...
<td><button class="layui-btn layui-btn-xs" onclick="add()">添加</button></td>
...
<script type="text/javascript">function add(){
layer.open({
type: 2,title: '添加',shade: 0.3,area: ['480px', '440px'],content: '/index/add'});} </script>
控制器新建一个add方法
public function add(){
if (Request::method() == "POST"){
$all = Request::param();$all['add_time'] = time();$install = Db::table('shop_goods')->insert($all);if ($install){
echo json_encode(['code' => 0, 'msg' => '添加成功']);}else{
echo json_encode(['code' => 1,'msg' => '添加失败']);}}elseif(Request::method() == "GET"){
$cat = Db::table('shop_cat')->where('status',1)->select();View::assign(['cat' => $cat]);return View::fetch();}else{
echo "操作错误";}}
6.6 利用判断请求方法添加一个删除按钮
index.html
...
<td><button class="layui-btn layui-btn-xs" onclick="del({$rr.id})">删除</button></td>
...
<script type="text/javascript">function del(id){
layer.confirm('确定要删除吗?', {
icon:3,btn: ['确定','取消']}, function(){
$.post('/index/del',{
'id':id},function(res){
if(res.code>0){
layer.alert(res.msg,{
icon:2});}else{
layer.msg(res.msg);setTimeout(function(){
window.location.reload();},1000);}},'json');});} </script>
controller
public function del(){
if (Request::method() == "POST"){
$id = Request::param('id');$delete = Db::table('shop_goods')->where('id',$id)->delete();if ($delete){
echo json_encode(['code' => 0, 'msg' => '删除成功']);}else{
echo json_encode(['code' => 1, 'msg' => '删除失败']);}}else{
echo json_encode(['code' => 1, 'msg' => '操作错误']);}}
七. 模型
- 模型是用于操作数据库的
- 模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
- 模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的table属性。
7.1 创建模型
条件:
配置表前缀
database.php 文件里 prefix
模型名 | 数据库前缀 |
---|---|
Cat | shop_cat |
Goods | shop_goods |
UserOrder | shop_user_order |
第一步:创建一个跟控制器平级的目录,目录名:model
第二步:在 model 创建 Goods.php 文件
7.2 模型操作
在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版
- 模型文件里的自定义方法,尽量不要和 thinkphp 方法一样名称
- 模型里的 Goods:: 也可以用 static:: 关键词
- 链式操作,都可以在模型里使用
find 查询数据
Goods.php 对应goods 数据库
public function getsql(){
$find = Goods::find(1);$find = Goods::where('id',1)->find();return $find;}
控制器调用模型
控制器引入Goods类,调用Goods类的getsql方法
返回值都为对象,可以使用 toArray()
在模型上 转换数据
<?phpnamespace app\controller;
use think\facade\Db;
use app\model\Goods;
class Test
{
public function test(){
$info = new Goods();$index = $info->getsql();print_r($index);}}
7.3 模型设置
为了和数据库更好的适配,模型可以提前设置对应的数据库属性,一个文件配置一个数据表
属性 | 描述 |
---|---|
name | 模型名(相当于不带数据表前后缀的表名,默认为当前模型类名) |
table | 数据表名(默认自动获取) |
pk | 主键名(默认为 id ) |
schema | 模型对应数据表字段及类型 |
type | 模型需要自动转换的字段及类型 |
disuse | 数据表废弃字段(数组) |
7.4 模型作用
获取器
获取器的作用是对模型实例的(原始)数据做出自动处理
命名规则:get + 字段名 + Attr
字段名是数据表字段的驼峰转换
class Goods extends Model{
public function index(){
$find = Goods::find(10);echo $find->status;return $find->toArray();}public function getStatusAttr($v){
$status = [1=>'开启',2=>'关闭'];return $status[$v];}
}
修改器
修改器的主要作用是对模型设置的数据对象值进行处理
命名规则: set + 字段名 + Attr
class Goods extends Model{
public function index(){
$create = Goods::create(['cat' => 3.33,'title' => '新商品','price' => '59.99','add_time' => time()]);return $create;}public function setCatAttr($v,$all){
// $all 全部参数return (int)$v;}
}
搜索器
搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式
命名规则: search + 字段名 + Attr
class Goods extends Model{
public function index(){
$select = Goods::withSearch(['title'],['title' => '新'])->select();return $select->toArray();}public function searchTitleAttr($query,$v){
$query->where('title','like', $v . '%');}
}
检查数据
如果要判断数据集是否为空,不能直接使用 empty 判断
必须使用数据集对象的 isEmpty 方法判断
class Goods extends Model{
public function index(){
$select = Goods::where('title','1')->select();if(empty($select)){
echo 111;}if($select->isEmpty()){
echo 111;}}
}
摘要
此学习项目一部分来源 PHP 中文网
已上传github:https://github.com/wpsec/Thinkphp6_shop