第8章 专题、分类、商品详情接口编写
https://coding.imooc.com/learn/list/97.html
8-1 Banner相关表分析(数据表关系分析) 14:37
8-2 模型关联----定于关联与查询关联 16:25
8-3 模型关联----嵌套关联查询 12:00
8-4 隐藏模型字段 19:06
8-5 在模型内部隐藏字段 13:05
8-6 图片资源URL配置 16:54
8-7 读取器的巧妙应用 14:40
8-8 自定义模型基类 12:27
8-9 定义API版本号 14:48
8-10 专题接口模型分析 18:08
8-11 一对一关系解析 09:26
8-12 Theme接口验证与重构 22:19
8-13 完成Theme简要信息接口 11:35
8-14 开启路由完整匹配模式 08:30
8-15 编写Theme详情接口 10:00
8-16 数据库字段冗余的合理利用 12:45
8-17 REST的合理利用 10:53
8-18 最近新品接口编写 22:56
8-19 使用数据集还是数组? 15:30
8-20 分类列表接口编写 09:18
8-21 扩展:接口粒度与接口分层 08:13
8-22 分类商品接口编写 10:31
8-1 Banner相关表分析(数据表关系分析) 14:37
8-2 模型关联----定于关联与查询关联 16:25
8-3 模型关联----嵌套关联查询 12:00
功能:
查出三表关联里对应的所有的字段
banner表,banner_item表里是中间表,它有所关联的两个表的外键(banner_id,img_id),image表
思路:
- 在controller控制器Banner.php里调用model层banner,model层Banner做一对多关联 hasMany()Banner_item表,
- model层BannerItem做定义相对关联 hasLongsTo() Image表,
- model层banner里$banner = self::with(['items','items.img'])->find($id);就可以查出三张表里符合条件的数据里
controller里:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Haima 5 * Date: 2018/7/8 6 * Time: 15:58 7 */ 8 9 namespace app\api\controller\v1; 10 use app\api\model\Banner as BannerModel; 11 use app\api\validate\IDMustBePostiveInt; 12 use app\lib\exception\BannerMissException; 13 14 class Banner 15 { 16 /** 17 * 获取指定id的banner信息 18 * @url /banner/:id 19 * @http GET 20 * @id banner的id号 21 */ 22 public function getBanner($id) 23 { 24 (new IDMustBePostiveInt())->goCheck(); //验证$id是否为正整数 25 26 //调用model层的方法: 27 //方法一:静态调用(当控制器和类名一样时用别名引入) 28 // 这样调用model层,model的类不需要继承Model类, 29 //但是调用的方法里需要自己写方法,在方法里写代码对库里的表进行操作 30 $banner = BannerModel::getBannerById($id);//调用model 31 32 33 if (!$banner){ 34 throw new BannerMissException(); //判断结果不存在,抛出异常 35 } 36 // return json($banner,200);//返回json格式的结果, 默认就是200状态码,可不写 37 return $banner;//返回json格式的结果, 默认就是200状态码,可不写 38 } 39 }
model(banner.php)里:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Haima 5 * Date: 2018/7/12 6 * Time: 1:16 7 */ 8 9 namespace app\api\model; 10 use think\Model; 11 12 class Banner extends Model //继承Model以后,Banner就变成一个模型层了 13 { 14 15 public function items() 16 { 17 //做一对多关联 hasMany('关联模型名','关联模型里关联本表的外键名','主表主键名',['模型别名定义']); 18 return $this->hasMany('BannerItem','banner_id','id'); 19 } 20 public static function getBannerById($id){ 21 //TODO 根据Banner 的 ID号 获取Banner信息 22 //wiht('调用上面的items()模型关系方法','调用items()下定义相对的关联') 23 $banner = self::with(['items','items.img']) 24 ->find($id); 25 26 return $banner; 27 } 28 }
model(BannerItem.php)里:
1 <?php 2 3 namespace app\api\model; 4 5 use think\Model; 6 7 class BannerItem extends Model 8 { 9 //对应的banner_item表里要隐藏的字段 10 //(表名是带_的,model名字要大驼峰法命名,model和表才能自动映射) 11 protected $hidden = ['id','img_id','banner_id','delete_time']; 12 13 public function img(){ 14 //定义相对的关联 belongsTo() 15 //第二层表(中间表)里有第三层表的外键. 16 //在有外键的第二层表里用belongsTo()做定义相对的关联 17 return $this->belongsTo('Image','img_id','id'); 18 } 19 }
访问结果:
8-4 隐藏模型字段 19:06
8-5 在模型内部隐藏字段 13:05
model(BannerItem.php)里:
1 <?php
2
3 namespace app\api\model;
4 5 use think\Model; 6 7 class BannerItem extends Model 8 { 9 //对应的banner_item表里要隐藏的字段 10 //(表名是带_的,model名字要大驼峰法命名,model和表才能自动映射) 11 protected $hidden = ['id','img_id','banner_id','delete_time']; 12 13 public function img(){ 14 //定义相对的关联 belongsTo() 15 //第二层表(中间表)里有第三层表的外键. 16 //在有外键的第二层表里用belongsTo()做定义相对的关联 17 return $this->belongsTo('Image','img_id','id'); 18 } 19 }
model(Image.php)里:
<?php
namespace app\api\model;
use think\Model;
class Image extends Model { //只显示的字段 protected $visible =['url','update_time']; }
访问结果:
没有用的结果都隐藏了
只显示image表里需要的字段
8-6 图片资源URL配置(读取配置文件里的参数) 16:54
思路:
读取setting.php和config.php的参数
config.php可以是最外层的,也可以是自己模块下的
控制器里:
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Haima 5 * Date: 2018/7/8 6 * Time: 15:58 7 */ 8 9 namespace app\api\controller\v1; 10 use app\api\model\Banner as BannerModel; 11 use app\api\validate\IDMustBePostiveInt; 12 use app\lib\exception\BannerMissException; 13 14 class Banner 15 { 16 /** 17 * 获取指定id的banner信息 18 * @url /banner/:id 19 * @http GET 20 * @id banner的id号 21 */ 22 public function getBanner($id) 23 { 24 (new IDMustBePostiveInt())->goCheck(); //验证$id是否为正整数 25 26 echo config('setting.url') . '<br>'; //拿setting.php里的参数 27 echo config('app_namespace'); //拿config.php里的参数 28 die; 29 //调用model层的方法: 30 //方法一:静态调用(当控制器和类名一样时用别名引入) 31 // 这样调用model层,model的类不需要继承Model类, 32 //但是调用的方法里需要自己写方法,在方法里写代码对库里的表进行操作 33 $banner = BannerModel::getBannerById($id);//调用model 34 35 36 if (!$banner){ 37 throw new BannerMissException(); //判断结果不存在,抛出异常 38 } 39 // return json($banner,200);//返回json格式的结果, 默认就是200状态码,可不写 40 return $banner;//返回json格式的结果, 默认就是200状态码,可不写 41 } 42 }
setting.php里:(直接return array)
config.php里:(直接return array)
访问结果:
读config.php里的二维数组:
print_r(config('mt_config.mt_cancel_sh')[2001]);
引入vendor目录里的文件
实例化后就可以使用引入实例的属性和方法了