-
Laravel 关联关系
2020-01-04 18:09:25学习且熟练使用laravel的关联关系, 帮助快速开发. 2. 学习/操作 2.1 介绍 https://xueyuanjun.com/post/19975 //laravel 关联关系, 建议认真阅读两遍, 然后实践至少一遍. ...1. 应用场景
学习且熟练使用laravel的关联关系, 帮助快速开发. 2. 学习/操作
2.1 介绍
https://xueyuanjun.com/post/19975 //laravel 关联关系, 建议认真阅读两遍, 然后实践至少一遍.
https://xueyuanjun.com/post/8867.html#toc_5
https://laravel.com/docs/6.x/eloquent-relationships //官网文档 Eloquent: Relationships
简单说:只有两种关系
从属关系: 一对一 [One To One], 一对多[One To Many 也是多对一 One To Many (Inverse)]
多对多关系: 多对多 [Many To Many]
2.2 实践 [标注开发中推荐使用的方式]
1. 查询
TBD 2. 新增
TBD 3. 更新
TBD 4. 删除
TBD 后续补充
...
3. 问题/补充
1. 什么是渴求式加载? 以及内部实现的原理, 执行的SQL是什么样子的?
TBD
2. 懒惰式加载与渴求式加载是什么关系?
TBD
3. 关联方法 Vs. 动态属性的区别?
TBD
...
4. 参考
https://xueyuanjun.com/post/19975 //laravel 关联关系
ttps://laravel.com/docs/6.x/eloquent-relationships //官网文档 Eloquent: Relationships
后续补充
...
-
MySQL关联关系
2017-07-12 23:48:05关联关系 在开发中,需要根据实体的内容设计数据表,实体间会有各种关联关系,所以,根据实体设计的数据表之间,也存在着各种关联关系。 MySQL中,数据表的关联关系分为三种一对一一对一关系,在实际生活中比较...关联关系
在开发中,需要根据实体的内容设计数据表,实体间会有各种关联关系,所以,根据实体设计的数据表之间,也存在着各种关联关系。
MySQL中,数据表的关联关系分为三种一对一
一对一关系,在实际生活中比较常见
比如,人与身份证之间,就是一对一的关系,一个人对应一张身份证,一张身份证只能匹配一个人。建立外键,首先,要分清主从关系,从表需要主表的存在才有意义,身份证需要人的存在,才有意义,因此,人为主表,身份证为从表,要在身份证中建立外键。
注意,这种方法关系在数据库中并不常见,因为,这种方式存储的信息通常会放在一个表中。
在实际开发中,一对一关联关系,可以应用于以下几个方面
1、分割具有很多列的表
2、由于安全原因,而隔离表的一部分
3、保存临时的数据,并且,可以毫不费力的通过删除该表,而删除这些数据多对一
多对一是数据表中,最常见的一种关系
比如,员工和部门之间的关系,一个部门可以有多个员工,但是,一个员工从属于一个部门,部门表中的一行在员工表中,可以有许多匹配行,但是,员工表中的一行,在部门表中只能有一个匹配行。建立外键,在多对一的表关系中,应该将外键建在多的一方,否则,会造成数据冗余。
多对多
多对多也是数据表中的一种关系
比如,学生与课程之间的关系,一个学生可以选择多门课程,一门课程可以供多个学生选择,学生表中的一行,在课程表中可以有许多匹配行,课程表中的一行,在学生表中也有许多匹配行通常情况下,实现这种关系,需要定义一张中间表,称为连接表,该表会存在两个外键,分别参考课程表和学生表
注意,连接表中的两个外键是可以重复的,但是,这两个外键之间的关系,是不能重复的,所以,这两个外键又是连接表的联合主键 -
SqlYog查看 多表关联关系工具,快捷删除 表关联关系
2017-07-31 21:04:13新建“架构设计器”编辑页,将要 查看表关系 的表,拖到 “架构设计器”编辑页。 如果关联关系已加上。拖动后,自动可见 可视化的 表之间 关联关系,图形界面。新建“架构设计器”编辑页,将要 查看表关系 的表,拖到 “架构设计器”编辑页。
如果关联关系已加上。拖动后,自动可见 可视化的 表之间 关联关系,图形界面。
快捷删除 表关联关系:
-
MySQL之关联关系
2018-11-03 13:09:47所以根据实体设计的数据表之间也存在着各种关联关系,MySQL中数据表的关联关系有三种。 2 关联关系 2.1 多对一 多对一是数据表中最常见的一种关联关系。例如部门和员工之间的关系,一个部门可以有多个员工,而一...1 简介
在实际开发中,需要根据实体的内容设计数据表,实体间会有各种关联关系。所以根据实体设计的数据表之间也存在着各种关联关系,MySQL中数据表的关联关系有三种。
2 关联关系
2.1 多对一
多对一是数据表中最常见的一种关联关系。例如部门和员工之间的关系,一个部门可以有多个员工,而一个员工不能属于多个部门,也就是说部门表中的一行在员工表中可以有许多匹配行,但员工表中的一行在部门表中只能有一个匹配行。
表之间的关系是由外键建立的。在多对一的表关系中,应该将外键建立在多的一方,否则会造成数据的冗余。注意:可以在多的一方设置外键保存另外一方的主键。
2.2 多对多
多对多也是数据表中一种关系,比如学生和课程的关系,一个学生可以选择多门课程,当然一门课程也可以供多个学生选择,即学生表中的一行在课程表中可以有许多匹配行,课程表中的一行在学生表中也有许多匹配行。
通常情况下,为了实现这种关系,需要定义一张中间表,称为连接表,该表会存在两个外键,分别参照课程表和学生表。在多对多的关系中,需要注意:连接表的两个外键都是可以重复的,但是两个外键之间的关系是不能重复的,所以这两个外键又是连接表的联合主键。
实际生活中,学生和老师的关系,也属于多对多。2.3 一对一
一对一关系在实际生活中比较常见,例如人与身份证之间的关系就是一对一的关系,一个人对应一张身份证,一张身份证只能匹配一个人。如何在数据表中建立这种关联关系呢?
首先,要分清主从关系,从表需要主表的存在才有意义,身份证需要人的存在才有意义,因此人为主表,身份证为从表。要在身份证表中建立外键。由实际经验克制,身份证中的外键必须是非空唯一的,因此通常会直接用从表(身份证表)中的主键作为外键。
一对一的关系,主要可以运用于以下几个方面。
1, 分割具有很多列的表
2, 由于安全原因而隔离表的一部分
3, 保存临时的数据,并且可以毫不费力的通过删除该表而删除这些数据。2.4 案例演示
2.4.1 材料
mysql> create table grade ( -> id int(4) not null primary key, -> name varchar(36) -> ); Query OK, 0 rows affected (0.56 sec) mysql> create table student ( -> sid int(4) not null primary key, -> sname varchar(36), -> gid int(4) not null -> ); Query OK, 0 rows affected (0.41 sec)
首先在表student和表grade中添加外键约束来建立两个表的关联关系。关于外键的定义、作用、添加和删除可以参见博客
mysql> desc grade -> ; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(4) | NO | PRI | NULL | | | name | varchar(36) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | sid | int(4) | NO | PRI | NULL | | | sname | varchar(36) | YES | | NULL | | | gid | int(4) | NO | | NULL | | +-------+-------------+------+-----+---------+-------+ rows in set (0.00 sec)
2.4.2 建立关联关系
mysql> alter table student add constraint FK_ID foreign key(gid) references gra Query OK, 0 rows affected (1.31 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> desc grade; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int(4) | NO | PRI | NULL | | | name | varchar(36) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql> desc student; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | sid | int(4) | NO | PRI | NULL | | | sname | varchar(36) | YES | | NULL | | | gid | int(4) | NO | MUL | NULL | | +-------+-------------+------+-----+---------+-------+ 3 rows in set (0.00 sec)
上述代码片段表名已经建立了student表和grade表的关联关系并且已经成功添加外键约束。
mysql> show create table student; +---------+-------------------------------------------------------------- | Table | Create Table +---------+-------------------------------------------------------------- | student | CREATE TABLE `student` ( `sid` int(4) NOT NULL, `sname` varchar(36) DEFAULT NULL, `gid` int(4) NOT NULL, PRIMARY KEY (`sid`), KEY `FK_ID` (`gid`), CONSTRAINT `FK_ID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 | +---------+-------------------------------------------------------------- row in set (0.00 sec)
从查询结果看,student表的外键约束已经成功添加。此时表student和表grade之间是多对一的关系。
2.4.3 添加数据
因此外键列只能插入参考列存在的值,所以要外两个表添加数据,就需要先为主表grade添加数据,具体如下:
mysql> insert into grade (id, name) values(1, "软件一班"); Query OK, 1 row affected (0.16 sec) mysql> insert into grade (id, name) values(2, "软件二班"); Query OK, 1 row affected (0.16 sec) mysql> select * from grade; +----+--------------+ | id | name | +----+--------------+ | 1 | 软件一班 | | 2 | 软件二班 | +----+--------------+ 3 rows in set (0.00 sec)
可以看到在grade班级表中已经插入了两条数据,添加的主键id为1和2,由于student表的外键与grade表的主键关联,因此在student表中添加数据时,gid的值只能是1或2,不能用其他的值。
mysql> insert into student(sid, name, gid) values(1, "王红", 1); ERROR 1054 (42S22): Unknown column 'name' in 'field list' mysql> insert into student(sid, sname, gid) values(1, "李青", 1); Query OK, 1 row affected (0.12 sec) mysql> insert into student(sid, sname, gid) values(1, "李青", 1); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> insert into student(sid, sname, gid) values(2, "王红", 1); Query OK, 1 row affected (0.21 sec) mysql> insert into student(sid, sname, gid) values(3, "赵云", 2); Query OK, 1 row affected (0.09 sec) mysql> insert into student(sid, sname, gid) values(4, "马云", 2); Query OK, 1 row affected (0.12 sec) mysql>
如果插入了grade表中不存在id值,报错如下
mysql> insert into student(sid, sname, gid) values(3, "李云龙", 5); ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `FK_ID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`)) mysql>
上述的代码片段中两个表之间的数据已经有了关联性。例如要查询软件一班有哪些学生,需要先查找软件一班的id,然后根据这个id查询该班级中有哪些学生。具体步骤如下:
mysql> select id from grade where name="软件一班"; //MySQL支持单引号和双引号中文 +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
然后再student表中查询gid=1的学生,即软件一班的学生。
mysql> select sname from student where gid=1; +--------+ | sname | +--------+ | 李青 | | 王红 | +--------+ 2 rows in set (0.05 sec)
2.4.4 删除数据
上一部分简单阐述了如何为关联表添加数据,在某些情况下还需要删除关联表中的数据。例如学校的软件一班取消了,就需要在数据库中将该班级以及该班级的学生一起删除。由于grade表和student表中存在关联关系,参照列被参照的的值不能被删除,因此在删除软件1班时,一定要先删除该班级的所有学生,然后再删除班级。如果直接删除grade表中仍存在参照关系的记录时报错如下:
mysql> delete from grade where id=1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`student`, CONSTRAINT `FK_ID` FOREIGN KEY (`gid`) REFERENCES `grade` (`id`)) 正确删除过程如下: mysql> select * from student; +-----+--------+-----+ | sid | sname | gid | +-----+--------+-----+ | 1 | 李青 | 1 | | 2 | 王红 | 1 | | 3 | 赵云 | 2 | | 4 | 马云 | 2 | +-----+--------+-----+ 4 rows in set (0.00 sec) mysql> delete from student where gid = 1; Query OK, 2 rows affected (0.15 sec) mysql> delete from grade where id=1; Query OK, 1 row affected (0.19 sec)
上述过程为正确的删除关联表的过程。
注意:在两个具有关联关系的表中删除数据时,一定要先删除从表中的数据,然后删除主表中的数据,否则会报错。
另外,在实际情况中,想要删除”软件一班”,并不需要删除”软件一班”的学生,可以将表student中”李青”,”王红”的gid改为NULL,只要主表中该列没有被参照就可以删除。但是由于在建表时,gid字段有非空约束,所以就只能将”李青”,”王红”的记录删除。
3 总结
本文详细的讲述了在MySQL使用过程中的关联关系的定义,演示了关联表中数据的添加和删除的过程
4 参考
传智博客MySQL数据库入门
5 文档下载
-
关联关系和依赖关系
2016-11-04 01:00:231、 关联关系 类A关联类B的意思是,如果实例化一个A类的对象,同时,会有一个B类的对象被实例化。简言之,B作为A的属性存在。如下: [java] view plain copy class A{ ... -
laravel 关联关系之多态关联
2018-04-17 02:07:36文章、作者与收藏的关联关系:收藏既可以是对文章的收藏,也可以是对作者的收藏 表:artist: 字段:id name 表:article: 字段:id title content 表:favorites: 字段:id favorite_type favorite_id class... -
UML图关联关系
2018-08-03 00:32:59UML图关联关系 关联关系共有四种,由弱至强依次是:依赖 <关联 < 聚合<组合 依赖 从代码层面上看,被依赖的类B作为参数被类A在某个方法中... -
UML关联关系
2012-07-06 10:49:53UML中的关联关系其内在意思就是has a 相对于依赖关系,关联关系在代码中有所体现.上图中的关联关系在代码中体现为 其中water 中将Climate作为其中的属性. 当然,关联关系中也有双相关联 关联又分为组合,... -
UML中类的关系:关联关系、聚合关系、依赖关系、泛化关系、实现关系
2017-01-15 20:03:49一、关联关系 关联关系是一种结构化的关系,指一种对象和另一种对象有联系。给定关联的两个类,可以从其中的一个类的对象访问到另一个类的相关对象。在UML图中,关联关系用一条实线表示。 另外,关联可以有方向,... -
laravel 模型关联关系 一对一关联
2019-09-29 14:24:45Model 模型关联关系 一对一 一对一 hasOne 反向一对一 belongsTo 一对一测试 user table public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id... -
关联关系和依赖关系的思考
2015-04-21 18:34:06关联关系和依赖关系的思考 从宏观上看类与类之间的关系有关联,依赖,泛化和实现。 这其中泛化和实现很好理解,关联和依赖之间的关系不好理解。 下面详细说一下这几个的意思: 1.泛化 泛化:表示类与类之间... -
一对一关联关系
2016-01-26 15:01:32一对一关联关系 -
hibernate注解配置关联关系
2016-08-27 18:23:391.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系。 JoinColumn(name="pid") 2. 在保存数据时,总是先保存的是没有维护关联关系的那一方的数据,后保存... -
关联关系映射——一对一关联
2016-12-18 12:44:23Hibernate映射实体的一对一关联关系有两种实现方式:共享主键方式和唯一外键方式。所谓共享主键方式就是限制两个数据表的主键使用相同的值,通过主键实现一对一映射关系,即主键相同。所谓唯一外键方式就是一个表... -
Hibernate学习笔记之关联关系
2017-04-15 00:17:42关联关系是面向对象分析、面向对象设计最重要的知识,Hibernate完全可以理解这种关联关系,如果映射得当,Hibernate的关联映射将可以大大简化持久层数据的访问。关联关系大致有如下两类: 单向关系:只需单向... -
UML关联关系和组合关系以及聚合关系的区别
2015-07-13 18:32:33正在学习uml,在网上找了这篇文章学习类之间的关系,虽然作者讲的已经很清楚,但...1.种类: Generalization(泛化),Dependency(依赖关系)、Association(关联关系)、Aggregation(聚合关系)、Composition(合成关系)。 -
依赖关系和关联关系的区别
2011-05-12 10:25:00依赖关系、关联关系 -
关联关系, 聚合关系,组合关系的区别
2013-05-03 23:28:59一, 关联关系 当一个类可用到,并引用到另一个类的对象时,可以用关联association, 在uml图中用实线箭头表示. 如 class myson { private Cparent cparent; } 二, 聚合关系 其实和关联关系是... -
Hibernate和数据库表关联关系的问题
2015-07-28 02:30:55我想问一下在实际的项目开发中,Hibernate的关联关系和数据库表的关联关系需要同时建立吗?就是既在持久化对象里写关联关系又在数据库里建外键 -
Hibernate表关联关系小结
2016-03-06 11:24:00Hibernate表关联关系小结 -
laravel-admin模型表单关联关系处理
2020-06-12 08:55:22laravel-admin模型表单的关联关系处理不支持小驼峰写法 用商品的规格举例 商品模型Goods.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Goods extends Model { protected $table = ... -
关于Power BI 关联关系可用性说明
2019-01-31 21:32:19Power BI表单关联关系说明以及USERELATIONSHIP函数简单介绍 -
依赖和关联关系的区别
2013-05-24 14:56:35以前在做分析时,总是感觉依赖和关联关系没有什么大的区别,或者说对于他们之间的细节还是不够清楚。 (1)依赖关系 依赖关系表示的是类之间的调用关系,即用一个类去调用另外一个类, 被调用的... -
MySQL关联关系association:1对1关联的三种方法
2018-05-07 11:04:26原文出自:http://blog.csdn.net/soonfly/article/details/63688288 本篇主要讲关联关系:一对一关系与一对多关系。 先建5个表: DROP TABLE IF EXISTS `category`; CREATE TABLE `category` ( `id` int(10) ... -
sql如何查看数据库表的关联关系?
2020-08-13 09:34:11不管是Navicat还是MySQL ...执行之后,Create Table这一行结果就是表的创建sql,可以将结果拷贝出来,查看表的关联关系。 通过查看表的创建sql,可以查看这个表的主键,唯一键,以及它和其他表的关联关系等信息。 ... -
Hibernate关联关系
2006-09-05 17:55:00在域模型钟,类与类之间最普遍的关系就是关联关系。例如,客户(Customer)和订单(Order)的关系,一个客户能发出多个订单,耳一个订单只能属于一个客户。从Order到Customer的关系是多对一关系,意味着每个Order... -
单据关联关系记录
2014-02-19 10:43:35单据转换后,通常需要记录两个单据之间的关联关系,以便能够实现上下查、反写、跨级反写。 单据转换关系的记录,分为两个大部分: 在下游单据上直接记录上游源单: K/3 Wise产品中,直接在单据体上增加源... -
Java类之间的关联关系
2016-08-10 18:05:18关联关系又可以细化为聚合和组合。 一、泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。 一般用一个带空心... -
Hibernate的多对多关联关系(单向和双向)
2016-12-06 20:14:00n-n(多对多)的关联关系必须通过连接表实现。下面以商品种类和商品之间的关系,即一个商品种类下面可以有多种商品,一种商品又可以属于多个商品种类,分别介绍单向的n-n关联关系和双向的n-n关联关系。单向的n-n关联...