ThinkPHP5——模型关联(多对多关联)
关联定义
多对多关联不像一对一和一对多关联,它还要多建一个中间表用来处理多对多的关联,例如:
#城市
create table city
(
c_id int primary key AUTO_INCREMENT comment "编号",
c_name varchar(255) comment '城市名称'
) #区域(别名)
create table area
(
a_id int primary key AUTO_INCREMENT comment "编号",
a_name varchar(255) comment '区域名称'
) #中间表(枢纽表)
create table city_area
(
id int primary key AUTO_INCREMENT comment "编号",
aid int comment '区域外键',
cid int comment '城市外键'
)
一个区域(别名)有多座城市,一座城市有多个区域(别名),例如:广州即属于一线城市,也是珠三角地区,同时它还叫“羊城”;而珠三角地区包括的城市有广州、佛山、肇庆、深圳、东莞、惠州等。
下面使用belongsToMany关联中间表,city(城市)模型:
<?php namespace app\demo\model;
use think\Model; class City extends Model //城市表
{
public function area(){
//belongsToMany('区域模型','中间表名','外键名','外键名');
return $this->belongsToMany('Area','city_area','aid','cid');
}
}
注:belongsToMany后面两个一定要对应中间表外键的顺序

area(区域)模型:
<?php namespace app\demo\model;
use think\Model; class Area extends Model //全国区域表
{
public function city(){
//belongsToMany('城市模型','中间表名','外键名','外键名');
return $this->belongsToMany("Area",'city_area','aid','cid');
}
}
中间表模型可以不需要建立
关联查询
我们可以通过下面的方式获取关联数据
$city = City::get(1);
foreach($city->area as $role){
// 获取城市id为1的所有区域名称
dump($role->a_name);
}
如果要获取中间表数据,可以使用
$city = City::get(1);
foreach($city->area as $role){
// 获取中间表数据
print_r($role->pivot);
}
关联新增
//关联单条新增
$city = City::get(1);
//增加关联数据 会自动写入中间表数据
$city->area()->save(['a_name'=>'珠三角地区']);
//批量新增
$city->area()->saveAll([
['a_name'=>'一线城市'],
['a_name'=>'羊城'],
]);
只新增中间表数据,可以使用
//方法一:添加中间表数据
$city = City::get(1);
//条件查询,找出珠三角地区
$area = Area::getByAName("珠三角地区");
//使用attach方法增加中间表的数据
$city->area()->attach($area);//新增数据:城市的id为1,区域为珠三角地区的id*/ //方法二:,效果等同方法一
$city = City::get(1);
$city->area()->attach(2);//新增数据:城市的id为1,区域为2
下面是新增中间表方法二执行的SQL语句:
INSERT INTO `city_area` (`cid` , `aid`) VALUES (1 , 2)
关联删除
只删除中间表数据,但不删关联模型的数据
//方法一:
$city = City::get(1);
$area = Area::getByAName("珠三角地区");
//关联删除数据,但不删关联模型的数据
$city->area()->detach($area); //方法二
$city = City::get(1);
//DELETE FROM `city_area` WHERE `cid` = 1 AND `aid` = 1
$city->area()->detach(1); //批量删除
$city->area()->detach([1]);
删除中间表方法二执行的SQL:
DELETE FROM `city_area` WHERE `cid` = 1 AND `aid` = 1
如果有必要,也可以删除中间表的数据同时删除关联模型
$city = City::get(1);
$area = Area::getByAName("羊城");
//这里不光删除中间表,也删除羊城
$city->area()->detach($area,true);
ThinkPHP5——模型关联(多对多关联)的更多相关文章
- thinkphp5 模型表关联
student 表 外键 grade_idgrade 表主键 id在 模型中student表关联方法public function Grade(){ return $this->hasOne(' ...
- ThinkPHP5——模型关联(一对一关联)
定义 定义一对一关联使用了hasOne,hasOne方法的参数包括: hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型'); 下面定义一个用户表,公司给每个用 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章 继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...
- (Hibernate进阶)Hibernate映射——多对多关联映射(八)
多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...
- 深入理解 Laravel Eloquent(三)——模型间关系(关联)
Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...
- 05.Hibernate多对多关联
前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系 本文根据学生信息表(tb_student)和教师信息表(tb_teac ...
- Mybatis 一对一、一对多、多对多关联之级联添加
示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 oppor ...
- 【SSH系列】Hibernate映射 -- 多对多关联映射
映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
随机推荐
- iOS:探究视图控制器的转场动画
一.介绍 在iOS开发中,转场动画的使用无处不见,不只是我们自己更多的使用UIViewblock动画实现一个转场动画,其实,在我们实现VC控制器跳转的时候都是转场动画的实现,例如标签栏控制器的切换.模 ...
- 【TCP/IP网络编程】:03地址族与数据序列
上一篇文章介绍了套接字的创建过程,这篇文章主要讨论分配给套接字的IP地址和端口号的相关知识. IP地址和端口号 IP(Internet Protocol,网络协议)地址是收发网络数据而分配给计算机的值 ...
- [模板]tarjan——最后通牒
这么久了我还是不会板子,你们随便笑话我吧. 再不会打我实在是无能为力了. 这篇博客写的像个智障一样...写它的目的就是自嘲? 才不是,为了方便查阅,因为我真的记不住. 对于割边,要存储该点入边的编号, ...
- CSPS_107
和教练谈话.jpg T1 枚举不动位置,枚举字母,可以$O(n^2)$ T2 暴筛 70 但是考虑枚举$m^{\frac{1}{3}}$之内的质数(怎么想到啊) 把它们消去以后,设剩下数x 若x含有平 ...
- 奶牛邻居——treap+契比雪夫距离+并查集
题目描述 了解奶牛们的人都知道,奶牛喜欢成群结队.观察约翰的N(1≤N≤100000)只奶牛,你会发现她们已经结成了几个“群”. 每只奶牛在吃草的时候有一个独一无二的位置坐标Xi,Yi(l≤Xi,Yi ...
- 基于 H5 Canvas 实现楼宇自控系统
前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...
- ios input输入不了
在项目中遇到了一个问题就是input输入框在安卓可以输入,而在ios输入不了 经过百度,调试发现,在ios中input默认是有user-select: none;属性把input输入框禁用了,将其删除 ...
- [剑指offer]删除链表中重复的结点(把重复的都删掉,1个不留)
①题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...
- mysql 创建用户及授权(2)
一. MySQL初始密码 新安装的MySQL默认是没有密码的,设置初始密码可以用以下命 mysqladmin -u root password 'new-password' mysqladmin -u ...
- .NET Core 获取数据库上下文实例的方法和配置连接字符串
目录 .NET Core 获取数据库上下文实例的方法和配置连接字符串 ASP.NET Core 注入 .NET Core 注入 无签名上下文 OnConfigure 配置 有签名上下文构造函数和自己n ...