关联定义

多对多关联不像一对一和一对多关联,它还要多建一个中间表用来处理多对多的关联,例如:

  1. #城市
  2. create table city
  3. (
  4. c_id int primary key AUTO_INCREMENT comment "编号",
  5. c_name varchar(255) comment '城市名称'
  6. )
  7.  
  8. #区域(别名)
  9. create table area
  10. (
  11. a_id int primary key AUTO_INCREMENT comment "编号",
  12. a_name varchar(255) comment '区域名称'
  13. )
  14.  
  15. #中间表(枢纽表)
  16. create table city_area
  17. (
  18. id int primary key AUTO_INCREMENT comment "编号",
  19. aid int comment '区域外键',
  20. cid int comment '城市外键'
  21. )

一个区域(别名)有多座城市,一座城市有多个区域(别名),例如:广州即属于一线城市,也是珠三角地区,同时它还叫“羊城”;而珠三角地区包括的城市有广州、佛山、肇庆、深圳、东莞、惠州等。

下面使用belongsToMany关联中间表,city(城市)模型:

  1. <?php
  2.  
  3. namespace app\demo\model;
  4. use think\Model;
  5.  
  6. class City extends Model //城市表
  7. {
  8. public function area(){
  9. //belongsToMany('区域模型','中间表名','外键名','外键名');
  10. return $this->belongsToMany('Area','city_area','aid','cid');
  11. }
  12. }

注:belongsToMany后面两个一定要对应中间表外键的顺序

area(区域)模型:

  1. <?php
  2.  
  3. namespace app\demo\model;
  4. use think\Model;
  5.  
  6. class Area extends Model //全国区域表
  7. {
  8. public function city(){
  9. //belongsToMany('城市模型','中间表名','外键名','外键名');
  10. return $this->belongsToMany("Area",'city_area','aid','cid');
  11. }
  12. }

中间表模型可以不需要建立

关联查询

我们可以通过下面的方式获取关联数据

  1. $city = City::get(1);
  2. foreach($city->area as $role){
  3. // 获取城市id为1的所有区域名称
  4. dump($role->a_name);
  5. }

如果要获取中间表数据,可以使用

  1. $city = City::get(1);
  2. foreach($city->area as $role){
  3. // 获取中间表数据
  4. print_r($role->pivot);
  5. }

关联新增

  1. //关联单条新增
  2. $city = City::get(1);
  3. //增加关联数据 会自动写入中间表数据
  4. $city->area()->save(['a_name'=>'珠三角地区']);
  5. //批量新增
  6. $city->area()->saveAll([
  7. ['a_name'=>'一线城市'],
  8. ['a_name'=>'羊城'],
  9. ]);

只新增中间表数据,可以使用

  1. //方法一:添加中间表数据
  2. $city = City::get(1);
  3. //条件查询,找出珠三角地区
  4. $area = Area::getByAName("珠三角地区");
  5. //使用attach方法增加中间表的数据
  6. $city->area()->attach($area);//新增数据:城市的id为1,区域为珠三角地区的id*/
  7.  
  8. //方法二:,效果等同方法一
  9. $city = City::get(1);
  10. $city->area()->attach(2);//新增数据:城市的id为1,区域为2

下面是新增中间表方法二执行的SQL语句:

  1. INSERT INTO `city_area` (`cid` , `aid`) VALUES (1 , 2)

关联删除

只删除中间表数据,但不删关联模型的数据

  1. //方法一:
  2. $city = City::get(1);
  3. $area = Area::getByAName("珠三角地区");
  4. //关联删除数据,但不删关联模型的数据
  5. $city->area()->detach($area);
  6.  
  7. //方法二
  8. $city = City::get(1);
  9. //DELETE FROM `city_area` WHERE `cid` = 1 AND `aid` = 1
  10. $city->area()->detach(1);
  11.  
  12. //批量删除
  13. $city->area()->detach([1]);

删除中间表方法二执行的SQL:

  1. DELETE FROM `city_area` WHERE `cid` = 1 AND `aid` = 1

如果有必要,也可以删除中间表的数据同时删除关联模型

  1. $city = City::get(1);
  2. $area = Area::getByAName("羊城");
  3. //这里不光删除中间表,也删除羊城
  4. $city->area()->detach($area,true);

ThinkPHP5——模型关联(多对多关联)的更多相关文章

  1. thinkphp5 模型表关联

    student 表 外键 grade_idgrade 表主键 id在 模型中student表关联方法public function Grade(){ return $this->hasOne(' ...

  2. ThinkPHP5——模型关联(一对一关联)

    定义 定义一对一关联使用了hasOne,hasOne方法的参数包括: hasOne('关联模型名','外键名','主键名',['模型别名定义'],'join类型'); 下面定义一个用户表,公司给每个用 ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (30) ------ 第六章 继承与建模高级应用之多对多关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第六章  继承与建模高级应用 现在,你应该对实体框架中基本的建模有了一定的了解,本章 ...

  4. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  5. 深入理解 Laravel Eloquent(三)——模型间关系(关联)

    Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...

  6. 05.Hibernate多对多关联

        前言:本文讲解使用Hibernate映射多对多关联关系,并使用多种方式映射多对多关联. 1.数据库表的多对多关系     本文根据学生信息表(tb_student)和教师信息表(tb_teac ...

  7. Mybatis 一对一、一对多、多对多关联之级联添加

    示例项目:MIPO_CRM 一.一对一关联 示例:订单与销售机会 描述:在业务员与客户的联系人的联系记录中可以生成一条销售机会,而此条销售机会可生成一条订单,两者呈一对一关联. 1.表设计 oppor ...

  8. 【SSH系列】Hibernate映射 -- 多对多关联映射

         映射原理 在数据库学习阶段,我们知道,如果实体和实体之间的关系是多对多,那么我们就抽出来第三张表,第一张表和第二张表的主键作为第三表的联合主键,结合我们的hibernate,多对多关联,无论 ...

  9. 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

    上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...

随机推荐

  1. 【建站02】WordPress主题设置

    大家好,我是帝哥.相信很多朋友看了我上一篇文章的介绍之后已经可以搭建自己的个人网站了,但是网站的功能和美观程度都还是有所欠缺的,现在呢,再给大家大概的介绍一些如何美化自己的网站,当然了,这个过程也是很 ...

  2. Django学习day8——admin后台管理和语言适应

    Django最大的优点之一,就是体贴的为你提供了一个基于项目model创建的一个后台管理站点admin.这个界面只给站点管理员使用,并不对大众开放. 1. 创建管理员用户 (django) E:\Dj ...

  3. 零基础小白入门IT开发指南

    先自我介绍以下,本人是一枚刚毕业不到两年的某一线城市的程序员,本科阶段专业是计算机科学与技术.从大四开始出去实习到现在的编码经验也有快2年半了,两年半的时间包括实习在内任职过有4家公司,包括一家互联网 ...

  4. JavaScript权威指南----一个JavaScript贷款计算器

    废话不多说上例子代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  5. NOI导刊集训感言

    圆溜溜,尤其首先,集训的收获很大,远远比自学要来的快 其次,新知识点到时没怎么讲(A*,数论除外,倒是真的学会不少以前碰都不敢碰的定理呀,结论之类的东西),但是还是深深地感受到了集训的困难,七天的节奏 ...

  6. Android9.0 SystemUI 网络信号栏定制修改

    前情提要 Android 8.1平台SystemUI 导航栏加载流程解析 9.0 改动点简要说明 1.新增 StatusBarMobileView 替代 SignalClusterView,用以控制信 ...

  7. 在ubuntu中安装minicom时出现device /dev/tty8 is locked解决办法

    未正常关闭minicom yesaidu@ywf-ubuntu: ~$ ls /var/lock LCK..ttyS0  subsys yesaidu@ywf-ubuntu: ~$ kill 0 ye ...

  8. 我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧

    编程任务:1.我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置.听说你是个优秀的程序 ...

  9. [ PyQt入门教程 ] PyQt5中数据表格控件QTableWidget使用方法

    如果你想让你开发的PyQt5工具展示的数据显得整齐.美观.好看,显得符合你的气质,可以考虑使用QTableWidget控件.之前一直使用的是textBrowser文本框控件,数据展示还是不太美观.其中 ...

  10. JSON数据与Java对象的相互转换

    JSON数据与Java对象的相互转换 JSON解析器 常见的解析器:Jsonlib .Gson. fastjson. jackson JSON转化为Java对象 使用步骤: 1.导入jackson的相 ...