# hinkPHP6.0 數據庫
ThinkPHP6 數據庫和模型操作已經獨立為ThinkORM庫.
* * *
## ThinkPHP6 數據庫
* ThinkPHP6 數據庫和模型操作已經獨立為`ThinkORM庫`
* 要使用Db類必須使用門面方式(`think\facade\Db`)調用
* 數據庫操作統一入口:`Db::`
## 一、數據庫管理軟件
1,phpMyAdmin(網頁數據庫管理)
2,Navicat for MySql(windows軟件數據庫管理)
## 二、創建數據庫
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);
2、商品分類表
> DROP TABLE IF EXISTS `shop\_cat`;
>
> 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、商品表
> 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);
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);
## 三、執行原生 MySql
1、`query`方法用于執行 MySql 查詢操作
> public function index(){
>
> ? ? $query = Db::query("SELECT \* FROM `shop\_goods` where status=1");
>
> ? ? print\_r($query);
>
> }
2、`execute`方法用于執行 MySql 新增和修改操作
> public function index(){
>
> ? ? $execute = Db::execute("INSERT INTO `shop\_goods` VALUES (3, 1, '2019秋冬新款時尚簡約純羊絨加厚圓領羊絨長裙顯瘦氣質連衣裙女', 1179.00, 0, 200, 1, 1576080000)");
>
> ? ? print\_r($execute);
>
> ? ? $execute = Db::execute("UPDATE `shop\_goods` set `price`='1100' where `id`=3 ");
>
> ? ? print\_r($execute);
>
> }
## 四、查詢
1、單條數據查詢 find
* `find`方法查詢結果不存在,返回 null,否則返回結果數組
> public function index(){
>
> ? ? $find = Db::table('shop\_goods')->find(5);
>
> ? ? print\_r($find);
>
> }
2、多條數據查詢 select
* `select`方法查詢結果是一個二維數組,如果結果不存在,返回空數組
> public function index(){
>
> ? ? $select = Db::table('shop\_goods')->select();
>
> ? ? print\_r($select);
>
> }
3、查詢某個字段的值 value
* `value`方法查詢結果不存在,返回 null
> public function index(){
>
> ? ? $value = Db::table('shop\_goods')->value('title');
>
> ? ? print\_r($value);
>
> }
4、查詢某一列的值 column
* `column`方法查詢結果不存在,返回空數組
> public function index(){
>
> ? ? $column = Db::table('shop\_goods')->column('title');
>
> ? ? print\_r($column);
>
> ? ? $column = Db::table('shop\_goods')->column('title','id');
>
> ? ? print\_r($column);
>
> }
## 五、添加
1、添加一條數據 insert
* `insert`方法添加數據成功返回添加成功的條數,通常情況返回 1
> public function index(){
>
> ? ? $data = \['cat'=>'1','title'=>'日系小浪漫與溫暖羊毛針織拼接網紗百褶中長收腰連衣裙','price'=>'1598.35','add\_time'=>1576080000\];
>
> ? ? $insert = Db::table('shop\_goods')->insert($data);
>
> ? ? print\_r($insert);
>
> }
2、添加一條數據 insertGetId
* `insertGetId`方法添加數據成功返回添加數據的自增主鍵
> public function index(){
>
> ? ? $data = \['cat'=>'1','title'=>'針織毛衣連衣裙2019秋冬新款氣質寬松羊毛長袖中長款休閑打底裙女','price'=>'690.00','add\_time'=>1576080000\];
>
> ? ? $insert = Db::table('shop\_goods')->insertGetId($data);
>
> ? ? print\_r($insert);
>
> }
3、添加多條數據 insertAll
* `insertAll`方法添加數據成功返回添加成功的條數
> public function index(){
>
> ? ? $data = \[
>
> ? ? ? ? \['cat'=>'1','title'=>'秋冬加厚連衣裙女超長款寬松羊絨衫高領套頭過膝毛衣百搭針織長裙','price'=>'658.00','add\_time'=>1576080000\],
>
> ? ? ? ? \['cat'=>'1','title'=>'2019新款秋冬慵懶風寬松毛衣針織連衣裙復古港味網紅兩件套','price'=>'408.00','add\_time'=>1576080000\],
>
> ? ? ? ? \['cat'=>'2','title'=>'男士長袖t恤秋季圓領黑白體恤T 純色上衣服打底衫男裝','price'=>'99.00','add\_time'=>1576080000\]
>
> ? ? \];
>
> ? ? $insert = Db::table('shop\_goods')->insertAll($data);
>
> ? ? print\_r($insert);
>
> }
## 六、修改
1、修改數據 update
* `update`方法返回影響數據的條數,沒修改任何數據返回 0
> public function index(){
>
> ? ? $data = \['price'=>'68'\];
>
> ? ? $update = Db::table('shop\_goods')->where('id',8)->update($data);
>
> ? ? print\_r($update);
>
> }
2、自增 inc
* `inc`方法自增一個字段的值
> public function index(){
>
> ? ? $inc = Db::table('shop\_goods')->where('id',5)->inc('stock')->update();
>
> ? ? print\_r($inc);
>
> ? ? # 字段的值增加5
>
> ? ? $inc = Db::table('shop\_goods')->where('id',6)->inc('stock',5)->update();
>
> ? ? print\_r($inc);
>
> }
3、自減 dec
* `dec`方法自減一個字段的值
> public function index(){
>
> ? ? # 字段的值減去1
>
> ? ? $dec = Db::table('shop\_goods')->where('id',7)->dec('stock')->update();
>
> ? ? print\_r($dec);
>
> ? ? # 字段的值減去5
>
> ? ? $dec = Db::table('shop\_goods')->where('id',8)->dec('stock',5)->update();
>
> ? ? print\_r($dec);
>
> }
## 七、刪除
1、刪除數據 delete
* `delete`方法返回影響數據的條數,沒有刪除返回 0
> public function index(){
>
> ? ? # 根據條件刪除數據
>
> ? ? $delete = Db::table('shop\_goods')->where('id',1)->delete();
>
> ? ? print\_r($delete);
>
> ? ? # 刪除主鍵為2的數據
>
> ? ? $delete = Db::table('shop\_goods')->delete(2);
>
> ? ? print\_r($delete);
>
> ? ? # 刪除整表數據
>
> ? ? $delete = Db::table('shop\_goods')->delete(true);
>
> ? ? print\_r($delete);
>
> }
2、軟刪除`useSoftDelete`
* 業務數據不建議真實刪除數據,TP系統提供了軟刪除機制
> public function index(){
>
> ? ? # 軟刪除
>
> ? ? $delete = Db::table('shop\_goods')->useSoftDelete('status',3)->delete();
>
> ? ? print\_r($delete);
>
> }
## 八、其他操作(自學)
* `save`方法統一寫入數據,自動判斷是新增還是更新數據(以寫入數據中是否存在主鍵數據為依據)。
> public function index(){
>
> ? ? # 添加數據
>
> ? ? $data = \['cat'=>'2','title'=>'美特斯邦威七分牛仔褲女2018夏季新款中腰修身洗水牛仔褲商場款','price'=>'49.90','add\_time'=>1576080000\];
>
> ? ? $save = Db::table('shop\_goods')->save($data);
>
> ? ? print\_r($save);
>
> ? ? # 修改數據
>
> ? ? $data = \['price'=>'99.00','id'=>3\];
>
> ? ? $save = Db::table('shop\_goods')->save($data);
>
> ? ? print\_r($save);
>
> }
備注:增刪查改是常規操作
## 九、數據集
* Thinkphp提供了很多處理數據集的方法
方法描述toArray 轉換為數組isEmpty 是否為空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查詢過濾數組中的元素
> public function index(){
>
> ? ? $select = Db::table('shop\_goods')->select();
>
> ? ? if($select->isEmpty()){
>
> ? ? ? ? echo '未找到數據';
>
> ? ? }
>
> ? ? print\_r($select->toArray());
>
> }
## 十、示例
controller代碼
> namespace app\\controller;
>
> use think\\facade\\View;
>
> class Index{
>
> ? ? public function index(){
>
> ? ? ? ? $title = '商城';
>
> ? ? ? ? $login = '歐陽克';
>
> ? ? ? ? $menu = Db::table('shop\_menu')->where('fid',0)->select();
>
> ? ? ? ? $left = $menu->toArray();
>
> ? ? ? ? foreach($left as &$left\_v){
>
> ? ? ? ? ? ? $left\_v\['lists'\] = Db::table('shop\_menu')->where('fid',$left\_v\['id'\])->select();
>
> ? ? ? ? }
>
> ? ? ? ? $list = Db::table('shop\_goods')->select();
>
> ? ? ? ? $right = $list->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();
>
> ? ? }
>
> }
view代碼:index.html
> {include file="public/head" /}
>
> {include file="public/left" /}
>
>
>
> ? ?
>
> ? ? ? ? 商品列表
>
> ? ? ? ? 添加
>
> ? ? ? ?
>
> ? ?
>
> ? ?
>
> ? ? ? ?
>
> ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ? ID
>
> ? ? ? ? ? ? ? ? 商品標題
>
> ? ? ? ? ? ? ? ? 分類
>
> ? ? ? ? ? ? ? ? 原價
>
> ? ? ? ? ? ? ? ? 折扣
>
> ? ? ? ? ? ? ? ? 現價
>
> ? ? ? ? ? ? ? ? 庫存
>
> ? ? ? ? ? ? ? ? 狀態
>
> ? ? ? ? ? ? ? ? 添加時間
>
> ? ? ? ? ? ? ? ? 操作
>
> ? ? ? ? ? ?
>
> ? ? ? ?
>
> ? ? ? ?
>
> ? ? ? ? ? ? {volist name="right" id="right\_v"}
>
> ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.id}
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.title}
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.cat}
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.price}
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.discount}
>
> ? ? ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ? ? ? ? ? {if $right\_v.discount!=0}
>
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? {$right\_v.price\*($right\_v.discount/10)}
>
> ? ? ? ? ? ? ? ? ? ? ? ? {else/}
>
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? {$right\_v.price}
>
> ? ? ? ? ? ? ? ? ? ? ? ? {/if}
>
> ? ? ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.stock}
>
> ? ? ? ? ? ? ? ? ? ? {if $right\_v\['status'\]==1}開啟{else/}關閉{/if}
>
> ? ? ? ? ? ? ? ? ? ? {$right\_v.add\_time|date='Y-m-d'}
>
> ? ? ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ? ? ? ? ? 編輯
>
> ? ? ? ? ? ? ? ? ? ? ? ? 刪除
>
> ? ? ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? ? ?
>
> ? ? ? ? ? ? {/volist}
>
> ? ? ? ?
>
> ? ?
>
>
>
> {include file="public/bottom" /}