ThinkPHP 5.0.7 + MySQL 构建RESTful API的小程序---02-ThinkPHP5中的orm的模型关联
ThinkPHP5.0中的操作ORM的一对一,一对多,多对多的操作;
由以下表举例:
banner表的设计
| id | name | description | delete_time | update_time |
| 1 | 首页置顶 | 首页轮播图 |
banner_item表的设计
| id | img_id | key_word | type | delete_time | banner_id | update_time |
| 1 | 65 | 6 | 1 | 1 | ||
| 2 | 2 | 25 | 1 | 1 | ||
| 3 | 3 | 11 | 1 | 1 | ||
| 5 | 1 | 10 | 1 | 1 |
image表的设计
| id | url | from | delete_time | update_time |
| 1 | /banner-1a.png | 1 | ||
| 2 | /banner-2a.png | 1 | ||
| 3 | /banner-3a.png | 1 | ||
| 4 | /category-cake.png | 1 |
theme表的设计
| id | name | description | topic_img_id | delete_time | head_img_id | update_time |
| 1 | 专题栏位一 | 美味水果世界 | 16 | 49 | ||
| 2 | 专题栏位二 | 新品推荐 | 17 | 50 | ||
| 3 | 专题栏位三 | 做个干物女 | 18 | 18 |
product表的设计
| id | name | price | stock | delete_time | category_id | main_img_url | from | create_time | update_time | summary | img_id |
| 1 | 芹菜 半斤 | 0.01 | 998 | 3 | /product-vg@1.png | 1 | 13 | ||||
| 2 | 梨花带雨 3个 | 0.01 | 989 | 2 | /product-dryfruit@1.png | 1 | 10 | ||||
| 3 | 素米 327克 | 0.01 | 988 | 7 | /product-rice@1.png | 1 | 31 | ||||
| 4 | 红袖枸杞 6克*3袋 | 0.01 | 987 | 6 | /product-tea@1.png | 1 | 32 |
theme_product表的设计
| theme_id | product_id |
| 1 | 2 |
| 1 | 5 |
| 2 | 1 |
| 2 | 2 |
| 3 | 15 |
1> 一对一的操作(belongsTo hasOne)
banner_item表与image表中图片表中的一对一关系(一个banner_item对应一张图片,一张图片只能对应一个banner_item图)
①.banner_item表中都有image表的外键img_id,在banner_item模型中写一下关联(belongsTo)
<?php
namespace app\api\model;
class BannerItem extends BaseModel
{
public function img(){
return $this->belongsTo('Image','img_id','id');
}
}
②.如果在image模型中写关联(hasOne)
<?php
namespace app\api\model;
class Image extends BaseModel
{
protected $hidden = ['id','from','delete_time','update_time'];
/**
*图片获取器
*/
public function getUrlAttr($value,$data){
return $this->prefixImgUrl($value,$data);
}
/**
*/
public function img(){
19 return $this->hasOne('BannerItem','img_id','id');
}
}
2>一对多的操作(hasMany)
banner表和banner_item表中的一对多关系(一个banner位可能对相应多个bannerItem,一个bannerItem只对应一个banner位)
①.banner_item表中存在banner表的外键banner_id,在banner模型中写一对多的关联模型(hasMany)
<?php
/**
* Created by PhpStorm.
* User: byzy
* Date: 2020/1/19
* Time: 10:53
*/
namespace app\api\model;
class Banner extends BaseModel
{
protected $hidden = ['delete_time', 'update_time'];
//关联
public function items(){
return $this->hasMany('BannerItem','banner_id','id');
}
}
在banner控制器中使用关联模型查询:
<?php
namespace app\api\controller\v1;
use app\api\model\Banner as BannerModel;
class Banner
{
/***
* 获取指定id的banner信息
* @http GET
* @id banner的id号
*/
public function getBanner($id){
$banner = BannerModel::with(['items','items.img'])->find($id);
return json($banner);
}
}
注意:使用模型外关联用.连接 item.img
3>多对多的的操作(belongsToMany)
themeb表与product表之间存在多对多关系(一个theme主题对应多个商品,一个商品对应多个theme主题)
由于两张表存在多对多的关系,所以可以通过构建第三张(theme_product)表来实现多对多的关系
从Theme模型出发来关联出所有的关联关系:
<?php
namespace app\api\model;
class Theme extends BaseModel
{
protected $hidden = ['delete_time','update_time','topic_img_id','head_img_id'];
public function topicImg(){
return $this->belongsTo('Image','topic_img_id','id');
}
public function headImg(){
return $this->belongsTo('Image','head_img_id','id');
}
public function products(){
return $this->belongsToMany('Product','theme_product','product_id','theme_id');
}
public static function getThemeWithProducts($id){
$theme = self::with('topicImg,headImg,products')
->find($id);
return $theme;
}
}
总结:ThinkPHP5.0中一对一两种(belongTo, hanOne)
一对多一种(hasMany)
多对多(belongsToMany)
ThinkPHP 5.0.7 + MySQL 构建RESTful API的小程序---02-ThinkPHP5中的orm的模型关联的更多相关文章
- 软件工程-构建之法 WordCount小程序 统计文件中字符串个数,单词个数,词频,行数
一.前言 在之前写过一个词频统计的C语言课设,别人说你一个大三的怎么写C语言课程,我只想说我是先学习VB,VB是我编程语言的开始,然后接触到C语言及C++:再后来我是学习C++,然后反过来学习C语言, ...
- 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作
以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本. 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Co ...
- Springboot 如何加密,以及利用Swagger2构建Restful API
先看一下使用Swagger2构建Restful API效果图 超级简单的,只需要在pom 中引用如下jar包 <dependency> <groupId>io.springfo ...
- 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五
目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts 记录进行 update 操作 删除一条记录 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 ...
- 用 Flask 来写个轻博客 (33) — 使用 Flask-RESTful 来构建 RESTful API 之二
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 构建 RESTful Flask API 定义资源路由 格式 ...
- 使用ASP.NET Core构建RESTful API的技术指南
译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...
- Spring MVC中使用 Swagger2 构建Restful API
1.Spring MVC配置文件中的配置 [java] view plain copy <!-- 设置使用注解的类所在的jar包,只加载controller类 --> <contex ...
- 使用Express构建RESTful API
RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...
- springboot集成swagger2构建RESTful API文档
在开发过程中,有时候我们需要不停的测试接口,自测,或者交由测试测试接口,我们需要构建一个文档,都是单独写,太麻烦了,现在使用springboot集成swagger2来构建RESTful API文档,可 ...
随机推荐
- 开发当中curl简单使用
curl是linux上可以发送http请求的命令.当然Postman是一个很好的接口调用管理工具,但在验证一个linux服务器调用另外一个linux服务器API是否可用的场景下,非curl命令莫属. ...
- jquery中报错Uncaught ReferenceError: $ is not defined的解决办法
jquery中报错提示为:Uncaught ReferenceError: $ is not defined 这个错误的原因就是你没有引入jquery库文件或者引入的路径不对造成的
- [梁山好汉说IT] 梁山好汉和秒杀系统
[梁山好汉说IT] 梁山好汉和秒杀系统 0x00 摘要 今天看了一篇好文章,里面一些思路颇值得借鉴.先摘录总结精华.然后看看梁山好汉如何处理秒杀系统(系统隔离/系统搭建/风控过滤/削峰/信号广播... ...
- TCP/IP||IP选路
1.选路原理 在IP搜索路由表分为几个步骤 1.搜索匹配的主机地址 2.搜索匹配的网络地址 3.搜索默认表项. IP层进行选路实际是一种选路机制,搜索路由表并决定向哪个网络接口发送分组,区别选路策略, ...
- windows10 powershell上切换至cmd
前言 在windows10 上是遇到了坑,因为出现了这样的情况!不要说什么盗版,公司买的正版呢. 上图是powershell,下图是 cmd,然后我同样使用powershell 与 cmd,查询nod ...
- Autofac总结
Autofac 介绍|术语 控制反转:IOC和DI IOC 调用者不再创建(不自己new)被调用者的实例,而是交给容器去创建(AutoFac就充当这里的容器),这就是控制反转 控制反转中引入的第三方对 ...
- 有关常用的UI组件
前段时间想看看大家都用什么UI组件,下面是在网上搜集的,记录在这里方便自己使用和其他小伙伴使用 1:WeUI 小程序–使用教程 https://weui.io/ 官方介绍:WeUI 是一套同微信原生视 ...
- FRPC 双向socket通讯 转发请求类轮子
一直在找一个能双向通讯的C#库 学识浅薄没有找到 于是封装一个预计BUG奇多的轮子 他是基于SuperSocket开发的 这样的 它跟传统的 架构不一样 它的最小架构 或者 客户端即是服务端 比如一个 ...
- Spring的BeanPostProcessor后置处理器与bean的生命周期
前言 本文将把Spring在Bean的生命周期中涉及到的后置处理器一一梳理出来,并简要说一下功能,至于每个后置处理器在实际扩展中的用处,还要后续慢慢探索总结. 正文 下面一步步跟进探寻那些后置处理器们 ...
- 洛谷P1832 A+B Problem(再升级) 题解 完全背包方案计数
题目链接:https://www.luogu.com.cn/problem/P1832 题目大意: 给定一个正整数n,求将其分解成若干个素数之和的方案总数. 解题思路: 首先找到所有 \(\le n\ ...