在之前的 项目 里继续往下写
- 在 Lib 目录下创建 Model 目录作为整个数据库操作层。
- 在 Model 目录下创建 Base.php 作为数据库操作层的基类封装数据库的连接和公用的数据库查询函数。
- 在 Model 目录下创建 Goods.php 类库来封装商品的相关操作处理。
- 在项目文件夹(cache文件夹)下创建 goods.php 来调用商品的 Goods Model,来实现商品的查询操作处理。
Lib/Model/Base.php
<?php
/**
* Model 基类
*/
namespace Lib\Model;
class Base{
/**
* @var \mysqli
*/
protected $mysqli;
public function __construct(){
try{
$mysqli = new \mysqli('192.168.1.214', 'root', 'asdf');
if(!$mysqli) throw new \Exception($mysqli->error);
//设置数据库连接编码
$mysqli->set_charset('utf8');
$mysqli->select_db('cache');
$this->mysqli = $mysqli;
}catch(\Exception $e){
echo $e->getMessage();
return false;
}
}
}
Lib/Model/Goods.php
<?php
/**
* 商品处理层
*/
namespace Lib\Model;
use Lib\Cache\Cache;
class Goods extends Base{
public function getOneGoodsById($goodsId){
/*
整体思路
判断缓存是否存在,如果存在,返回商品缓存
如果不存在,查询 goods 和 pic
查询 goods_info
查询 goods_attr
设置缓存
*/
if(!$goodsId) return false;
$cacheKey = $this->getCacheKey($goodsId);
$cache = Cache::Factory('file', [
'pre_fix' => 'ASDF',
'file_ext' => '.cache'
]);
$goods = $cache->get($cacheKey);
//缓存不存在,查询数据库获取相关信息
if(!$goods || !$goods = json_decode($goods, true)){
// 获取商品主表信息
$sql = "SELECT * FROM `goods` WHERE `id`={$goodsId}";
$obj = $this->mysqli->query($sql);
if(!$obj->num_rows) return false;
$goods = $obj->fetch_assoc();
// 查询图片信息
unset($sql, $obj);
$picList = [];
$picIds = explode(',', $goods['pic_ids']);
$picIds = array_unique($picIds);
$picIds = '('.implode(',', $picIds).')';
$sql = "SELECT * FROM `pic` WHERE `id` in {$picIds}";
$obj = $this->mysqli->query($sql);
if($obj->num_rows){
while($result = $obj->fetch_assoc()){
$picList[] = $result;
}
}
$goods['pic_list'] = $picList;
// 查询商品详情表
unset($sql,$obj);
$sql ="SELECT * FROM `goods_info` WHERE `goods_id`={$goodsId}";
$obj = $this->mysqli->query($sql);
if($obj->num_rows){
$goodsInfo = $obj->fetch_assoc();
$goods = array_merge($goodsInfo, $goods);
}
// 查询商品规格表
unset($sql,$obj);
$goodsAttr = [];
$sql ="SELECT * FROM `goods_attr` WHERE `goods_id`={$goodsId}";
$obj = $this->mysqli->query($sql);
if($obj->num_rows){
while($result = $obj->fetch_assoc()){
$goodsAttr[] = $result;
}
$goods['attr'] = $goodsAttr;
}
// 设置缓存
$goods['cache_set_time'] = time();
$cache->save($cacheKey, json_encode($goods, JSON_UNESCAPED_UNICODE), 10);
}
return $goods;
}
/**
* 根据 goodsId 获取缓存 key
* @param $goodsId
* @return string
*/
public function getCacheKey($goodsId){
return "goods:cache:{$goodsId}";
}
/*
手动释放商品缓存
当update商品的时候 cleanCache
*/
public function updateGoods($update, $where){
//更新处理
$result = true;
if($result !== false){
$this->cleanGoodsCache($where['goods_id']);
}
return true;
}
/**
* 删除商品缓存
* @param $goodsId
* @return bool
*/
public function cleanGoodsCache($goodsId) {
if(!$goodsId) return false;
$cacheKey = $this->getCacheKey($goodsId);
$cache = Cache::Factory('file', [
'pre_fix' => 'ASDF','
file_ext' =>'.cache'
]);
$cache->delete($cacheKey);
return true;
}
}
goods.php
<?php
//定义项目根目录常量
define('ROOT',dirname(__FILE__));
require_once ROOT.'/Lib/AutoLoad.php';
$model = new \Lib\Model\Goods();
$result = $model->getOneGoodsById(1);
var_dump($result);
数据库和数据表
-- phpMyAdmin SQL Dump
-- version 4.9.0.1
-- https://www.phpmyadmin.net/
--
-- 主机: localhost
-- 生成日期: 2019-06-16 16:50:00
-- 服务器版本: 5.7.26
-- PHP 版本: 7.2.18
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- 数据库: `cache`
--
-- --------------------------------------------------------
--
-- 表的结构 `goods`
--
CREATE TABLE `goods` (
`id` int(11) NOT NULL COMMENT '商品id',
`name` varchar(255) DEFAULT NULL COMMENT '商品名称',
`pic_ids` varchar(50) DEFAULT NULL COMMENT '商品图片id信息',
`cate_id` int(11) DEFAULT NULL COMMENT '商品分类id',
`price` decimal(10,2) DEFAULT NULL COMMENT '价格',
`goods_code` varchar(100) DEFAULT NULL COMMENT '商品编码',
`stock` int(11) DEFAULT NULL COMMENT '商品库存',
`create_time` int(11) DEFAULT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';
--
-- 转存表中的数据 `goods`
--
INSERT INTO `goods` (`id`, `name`, `pic_ids`, `cate_id`, `price`, `goods_code`, `stock`, `create_time`) VALUES
(1, 'PHP项目开发实战', '1,2,3', 1, 499.00, 'JSSKU01041901', 200, 1560670753);
-- --------------------------------------------------------
--
-- 表的结构 `goods_attr`
--
CREATE TABLE `goods_attr` (
`id` int(11) NOT NULL COMMENT '主键id',
`goods_id` int(11) DEFAULT NULL COMMENT '商品id',
`attribute_value` varchar(1000) DEFAULT NULL COMMENT '商品规格属性',
`stock` int(11) DEFAULT NULL COMMENT '库存',
`price` decimal(10,2) DEFAULT NULL COMMENT '商品价格',
`goods_code` varchar(100) DEFAULT NULL COMMENT '商品编码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品规格属性表';
--
-- 转存表中的数据 `goods_attr`
--
INSERT INTO `goods_attr` (`id`, `goods_id`, `attribute_value`, `stock`, `price`, `goods_code`) VALUES
(1, 1, '班级:普通班;授课方式:视频教学;', 50, 499.00, 'JSSKU01041902'),
(2, 1, '班级:vip班;授课方式:远程教学;', 25, 1499.00, 'JSSKU01041903'),
(3, 1, '班级:普通班;授课方式:远程教学;', 25, 899.00, 'JSSKU01041904'),
(4, 1, '班级:vip班;授课方式:视频教学;', 25, 2499.00, 'JSSKU01041905');
-- --------------------------------------------------------
--
-- 表的结构 `goods_info`
--
CREATE TABLE `goods_info` (
`id` int(11) NOT NULL COMMENT '主键id',
`goods_id` int(11) DEFAULT NULL COMMENT '商品id',
`desc` text COMMENT '商品详情',
`weight` int(11) DEFAULT NULL COMMENT '商品重量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品详情表';
--
-- 转存表中的数据 `goods_info`
--
INSERT INTO `goods_info` (`id`, `goods_id`, `desc`, `weight`) VALUES
(2, 1, '通过本课程的学习,理解xx的核心原理、设计思想,掌握框架的各项知识。', NULL);
-- --------------------------------------------------------
--
-- 表的结构 `pic`
--
CREATE TABLE `pic` (
`id` int(11) NOT NULL COMMENT '主键id',
`url` varchar(255) DEFAULT NULL COMMENT '图片地址',
`mime_type` varchar(50) DEFAULT NULL COMMENT 'mime类型',
`create_time` int(11) DEFAULT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- 转存表中的数据 `pic`
--
INSERT INTO `pic` (`id`, `url`, `mime_type`, `create_time`) VALUES
(1, 'https://test.com/images/551b45781e665.jpg', 'image/jpeg', 1560670753),
(2, 'https://test.com/images/551c9b0cb165e.jpg', 'image/jpeg', 1560670753),
(3, 'https://test.com/images/553457cb809cc.jpg', 'image/jpeg', 1560670753);
--
-- 转储表的索引
--
--
-- 表的索引 `goods`
--
ALTER TABLE `goods`
ADD PRIMARY KEY (`id`);
--
-- 表的索引 `goods_attr`
--
ALTER TABLE `goods_attr`
ADD PRIMARY KEY (`id`),
ADD KEY `goods_id` (`goods_id`);
--
-- 表的索引 `goods_info`
--
ALTER TABLE `goods_info`
ADD PRIMARY KEY (`id`),
ADD KEY `goods_id` (`goods_id`);
--
-- 表的索引 `pic`
--
ALTER TABLE `pic`
ADD PRIMARY KEY (`id`);
--
-- 在导出的表使用AUTO_INCREMENT
--
--
-- 使用表AUTO_INCREMENT `goods`
--
ALTER TABLE `goods`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id', AUTO_INCREMENT=2;
--
-- 使用表AUTO_INCREMENT `goods_attr`
--
ALTER TABLE `goods_attr`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', AUTO_INCREMENT=5;
--
-- 使用表AUTO_INCREMENT `goods_info`
--
ALTER TABLE `goods_info`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', AUTO_INCREMENT=3;
--
-- 使用表AUTO_INCREMENT `pic`
--
ALTER TABLE `pic`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', AUTO_INCREMENT=4;
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;