多对多关系模型
laravel 模型 多对多关联关系

Laravel是一款流行的PHP框架,它提供了丰富而强大的数据库操作功能,包括模型的多对多关联关系。
通过Laravel的Eloquent模型,我们可以轻松地建立多对多的关联关系,使得应用程序的数据库设计更加灵活和可扩展。
本文将详细介绍Laravel模型中的多对多关联关系的使用方法和注意事项。
一、多对多关联关系的概念和使用场景1.1 概念多对多关联关系是数据库设计中常见的一种关系,它表示两个实体之间存在多对多的关系。
在数据库中,多对多的关系通常需要通过中间表来进行建模和存储。
在Laravel中,通过Eloquent模型可以很方便地处理多对多的关联关系。
1.2 使用场景多对多关联关系在实际应用中有许多场景,例如文章和标签之间的关系、用户和角色之间的关系、课程和学生之间的关系等等。
通过多对多的关联关系,我们可以轻松地实现这些实体之间的复杂关系,并且可以方便地进行操作和查询。
二、Laravel模型中的多对多关联关系2.1 创建中间表在Laravel中,要实现多对多的关联关系,首先需要创建中间表来存储两个实体之间的关系数据。
中间表通常包含两个外键,分别与两个实体的主键相对应。
```phpSchema::create('article_tag', function (Blueprint $table) {$table->unsignedBigInteger('article_id');$table->unsignedBigInteger('tag_id');$table->timestamps();});```2.2 定义模型关联在Laravel中,可以通过Eloquent模型的关联方法来定义多对多的关联关系。
在实体的模型中,使用belongsToMany方法来定义多对多的关联关系。
```phpclass Article extends Model{public function tags(){return $this->belongsToMany(Tag::class);}}``````phpclass Tag extends Model{public function articles(){return $this->belongsToMany(Article::class);}}```2.3 操作关联数据通过定义好的关联关系,可以轻松地进行关联数据的操作,包括添加、删除、查询等。
数据库表关系模型解析6——多对多

数据库表关系模型解析6——多对多狼奔代码生成器是一款为程序员设计的前期开发辅助工具,是一个软件项目智能开发的平台,它可以自动生成页面及后台代码。
实践开发过程中,我们使用PowerDesigner设计数据库模型。
狼奔代码生成器就是读取PowerDesigner设计的数据库模型,分析其中的表与表之间的关系模型,分析其中的表和字段的说明信息中的关键字,自动生成不同的页面。
表与表之间的关系模型包括1.单表数据模型2.自连接数据模型3.一对一数据模型4.一对多数据模型5.一对多数据模型中的一张表是自连接6.多对多数据模型7.多对多数据模型中的一张表是自连接关键字包括1.查询2.状态3.上传4.工作流架构图数据访问层(DAL)数据实体Entity Framework业务实体和校验元数据业务逻辑层(BLL)业务处理工作流事务接口层(IBLL)服务契约展示层(App )View (视图)Controller (控制器)Models (页面实体)对其他系统暴露服务Service (服务)公共组件安全组件日志记录异常捕获公共类库(Common)组件说明图表1项目组件说明图1)App——页面展示层采用MVC框架,使用Jquery脚本库,控件选用Easyui。
2)WcfHost——服务宿主(后期扩展)为对外的服务提供宿主,使用WCF技术,HTTPS通讯协议。
3)IBLL——业务接口层业务逻辑层的方法对外暴露的接口和服务契约。
4)BLL——业务逻辑层业务逻辑的操作,包括业务处理,事务,日志。
5)DAL——数据访问层数据库访问的操作,数据实体,业务实体,数据校验,使用Entity Framework。
6)Common——公共组件层整个应用程序使用的公共辅助方法。
7)WFActivitys——工作流活动层(后期扩展)定义了工作流需要的活动,使用微软WF技术。
8)WFDesigner——工作流设计器(后期扩展)可以让实施人员自由配置工作流的设计器,使用微软WPF技术。
mysql er模型关系连线解析

mysql er模型关系连线解析
ER模型(Entity-Relationship model)是一种数据库设计方法,用于描述数据库中数据实体之间的关系。
其中,关系连线是表示实体之间关系的一种方法。
在ER 模型中,关系连线有三种类型:一对一关系、一对多关系和多对多关系。
下面将对这三种关系连线进行解析。
一对一关系是指两个实体之间存在唯一的关系。
例如,一个人只能有一个身份证号,一个身份证号也只能对应一个人。
在ER模型中,一对一关系使用一个直线连接两个实体表示。
一对多关系是指一个实体与多个实体之间存在关系。
例如,一个部门可以有多个员工,但一个员工只能属于一个部门。
在ER模型中,一对多关系使用一个箭头从“一”端指向“多”端表示。
多对多关系是指多个实体之间存在多对多的关系。
例如,一个学生可以选择多门课程,一个课程可以有多个学生选修。
在ER模型中,多对多关系使用一个菱形表示。
通过ER模型中的关系连线,可以清晰地表示实体之间的关系,有助于设计和理解数据库结构。
在进行数据库设计时,需要根据实际需求和业务逻辑,合理地使用不同类型的关系连线。
总结:关系连线是ER模型中表示实体之间关系的一种方法。
一对一关系使用直线连接两个实体,一对多关系使用箭头从“一”端指向“多”端,多对多关系使用菱形表示。
合理使用关系连线有助于设计和理解数据库结构。
举例说明一对一,一对多,多对多关系

举例说明一对一,一对多,多对多关系一对一、一对多和多对多关系是数据库中常见的关系模型,用于描述数据实体之间的关联。
下面将分别以不同领域的实例来说明这三种关系模型。
一对一关系:1. 身份证和个人:一个人只能拥有一个身份证,而一个身份证也只能属于一个人。
2. 学生和班主任:一个学生只能有一个班主任,而一个班主任也只能负责一个学生。
3. 用户和手机号码:一个用户只能绑定一个手机号码,而一个手机号码也只能被一个用户绑定。
4. 员工和档案:一个员工只有一个档案,而一个档案也只能对应一个员工。
5. 作者和书籍:一个作者只能创作一本书籍,而一本书籍也只能由一个作者创作。
一对多关系:1. 学校和学生:一个学校可以有多个学生,但一个学生只能属于一个学校。
2. 部门和员工:一个部门可以有多个员工,但一个员工只能属于一个部门。
3. 班级和学生:一个班级可以有多个学生,但一个学生只能属于一个班级。
4. 作者和书籍:一个作者可以创作多本书籍,但一本书籍只能由一个作者创作。
5. 电视剧和演员:一部电视剧可以有多个演员,但一个演员只能参演一部电视剧。
多对多关系:1. 学生和课程:一个学生可以选择多门课程,一门课程也可以有多个学生选择。
2. 顾客和商品:一个顾客可以购买多个商品,一个商品也可以被多个顾客购买。
3. 音乐家和乐器:一个音乐家可以演奏多种乐器,一个乐器也可以被多个音乐家演奏。
4. 饭店和菜品:一个饭店可以供应多种菜品,一种菜品也可以在多个饭店供应。
5. 作家和书籍:一个作家可以创作多本书籍,一本书籍也可以由多个作家创作。
以上是一对一、一对多和多对多关系的举例,它们在实际应用中具有广泛的应用。
在数据库设计和数据处理中,合理地使用这些关系模型可以更好地组织和管理数据。
用PowerDisigner建立一对一和多对多模型解析

一对一模型身份证----------用户建立模型之前首先得想一下要建立一对一的模型的思路,建立模型思路才是最重要的,思路想好了用工具很快就会生成。
一对一模型的建立有两种方式:相同主键 (继承来实现,只继承主键)唯一外键:一对多的一种特殊形式(外键是unique)1、相同主键型的一对一模式(1)先创建两个概念模型身份证用户用户的概念模型中没有设置主键(2)用inheritance,从用户模型连接到身份证模型(3)双击设置继承关系,选择inherit only primary altributes,只继承主键属性,否则会把所有属性在用户里再显示(4)tool--转换成物理模型(5)Database--生成脚本文件,去掉check model(如果没有连接pl/sql就选script generation)(6)如果面板上还有其他模板,勾选掉(7)接下来确定,就可以成功生成脚本文件了。
用生成的脚本文件在plsql的命令窗口运行,生成两个表,插入数据先插入身份证再插入用户表信息想要在用户表中加入身份证号是3的用户就会出错。
idnum既是用户表的主键又是用户表的外键。
2、唯一外键型的一对一模型(1)各自创建两个概念模型都有主键(2)表A-------表B建立一对多关系(3)转换为物理模型(4)生成脚本文件(5)在脚本文件里把有外键的一个表的外键加上unique约束(6)在pl/sql中运行脚本文件生成的两个表就是一对一关系。
多对多模型学生--------课程要实现多对多的先想一下思路1)建两个表学生表、课程表行吗?不行2)需要再有一个新建表作为中间表,两个表都连在这个中间表上这个中间表有两种实现方式:组合主键:两者就是只建立关系是使用新主键:除了建立关系还需存储一定量的数据时使用这里只记录组合主键方式多对多实现(1)创建两个模型创建完大学生表模型后,再在课程里输入name自动出现了格式,因为前者中有name默认一样格式,不碍事(2)添加Association_1作为中间表,双击也可以在第二个页面添加这个关系的属性,比如成绩(3)用Association_link连接可见建立模型是简单的,重要的是多对多的思路,思路建立起来建立模型会很快。
ER模型转换为关系模型规则

ER模型转换为关系模型规则
关系模型是一种用于描述数据之间关系的模型,而ER模型是一种用于描述实体、实体之间关系、实体的属性的模型。
将ER模型转换为关系模型的规则如下:
1. 实体转换为关系表:
- 实体的每个属性转换为关系表中的一个列。
- 实体的主键属性作为关系表中的主键列。
- 若实体存在多值属性,则将其拆分为独立的关系表,与实体的关系表之间通过主键-外键关系连接。
2. 实体之间的一对多(1:N)关系:
- 子实体的主键作为父实体的外键列。
3. 实体之间的多对多(N:N)关系:
- 将多对多关系转换为独立的关系表,并包含两个实体的主键作为外键列。
4. 实体之间的一对一(1:1)关系:
- 将一对一关系的实体合并为一个关系表。
5. 属性与属性之间的关系:
- 若两个属性之间存在函数依赖关系(其中一个属性根据另
一个属性能够确定),则将其合并为同一个关系表的不同列。
这些规则可以帮助将ER模型转换为关系模型,并保持数据的一致性和完整性。
转换后的关系模型可以进一步用于数据库设计和数据处理。
简述实体联系模型

简述实体联系模型
实体联系模型(EntityRelationshipModel),简称ER模型,是一种用于描述现实世界中各种实体之间关系的数据模型。
它是一种图形化的工具,通过图形符号的组合来表示实体、属性和它们之间的关系。
在ER模型中,实体是指现实世界中具有独立存在和可区分性的对象,例如人、机器、事物等。
每个实体都具有一组属性,用于描述其特征和属性值,例如人的姓名、年龄、性别等。
实体之间的联系主要包括三种类型:一对一、一对多和多对多。
一对一联系是指两个实体之间存在唯一的对应关系,例如一个人只有一个身份证号码;一对多联系是指一个实体与多个其他实体之间存在关联,例如一个学生可以报读多门课程;多对多联系是指多个实体之间相互关联,例如多个学生可以选修同一门课程。
为了更好地描述实体之间的联系,ER模型中引入了关系模型,用于表示两个实体之间的关联。
关系模型包括三个要素:关系名、实体集合和联系类型。
其中,关系名是指关系的名称,实体集合是指参与关系的实体集合,联系类型是指关系的类型。
在ER模型中,实体用矩形表示,属性用圆角矩形表示,联系用菱形表示。
实体之间的联系用线段连接,线段上标注联系类型表示关系的类型。
通过ER模型,可以清晰地描述现实世界中各种实体之间的关系,为数据库设计提供了重要的参考。
- 1 -。
数据库设计中一对一、多对一、多对多关系依据外键的实现条件及方法

数据库设计中⼀对⼀、多对⼀、多对多关系依据外键的实现条件及⽅法下⾯以departments和staff_info表为例(为staff_info添加指向departments的外键)⼀个表的字段作为外键的条件:列值必须⾮空且唯⼀测试例⼦如下:mysql> create table departments (dep_id int(4),dep_name varchar(11));Query OK, 0 rows affected (0.02 sec)mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | YES | | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.00 sec)# 创建外键不成功mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));ERROR 1215 (HY000): Cannot add foreign key# 设置dep_id⾮空,仍然不能成功创建外键mysql> alter table departments modify dep_id int(4) not null;Query OK, 0 rows affected (0.02 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | NO | | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.00 sec)mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));ERROR 1215 (HY000): Cannot add foreign key constraint# 当设置字段为unique唯⼀字段时,设置该字段为外键成功mysql> alter table departments modify dep_id int(4) unique;Query OK, 0 rows affected (0.01 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> desc departments;+----------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+-------------+------+-----+---------+-------+| dep_id | int(4) | YES | UNI | NULL | || dep_name | varchar(11) | YES | | NULL | |+----------+-------------+------+-----+---------+-------+rows in set (0.01 sec)mysql> create table staff_info (s_id int,name varchar(20),dep_id int,foreign key(dep_id) references departments(dep_id));Query OK, 0 rows affected (0.02 sec)特别注意:需要主外结合的两个表必须是使⽤同样的⼀个引擎类型:两个表必须都是innodb存储引擎添加外键的⽅法⼀般有两种⽅法,在创建表的时候添加,或者后期再添加创建时添加mysql> create table score(-> sid int not null auto_increment primary key,-> student_id int,-> corse_id int,-> number int not null,-> constraint fk_sid foreign key (student_id) references student(sid),-> constraint fk_corse_id foreign key (corse_id) references course(cid));-----------------------------------------------------------------------------------[CONSTRAINT symbol] FOREIGN KEY [id] (从表的字段1)REFERENCES tbl_name (主表的字段2)[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}][ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}CONSTRAINT symbol:可以给这个外键约束起⼀个名字,有了名字,以后找到它就很⽅便了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
今天谈的是Laravel中一个非要有用,但一开始可能有点难理解的功能。
Pivot 表是两个“主表”之间关系的中间表。
Pivot 表实例
在官方文档中,他们用用户-角色(User-Role) 关系来做例子,用户可能会属于多个角色,反之亦然。
为了使大家理解的更清楚,我们这里举另一个例子:商店( Shops )与商品( Products )。
我们假设一个商家有多个商店遍布全国各地,并且有各种各样的商品,他们需要存储哪个商品是由哪个商店卖出的信息。
这是一个多对多关系非常好的例子:一个商品可以属于多个商店,而一个商店又会有很多的商品。
所以这里就有一个潜在的数据库结构:
shops
– id
– name
products
– id
– name
product_shop
– product_id
– shop_id
列表中最后一个表product_shop就是标题中被称作“pivot”的表。
这里有几点需要注意的:
Pivot表的名字应该包含两个表名的单数形式,由下划线分开,并按字母顺序排列,所以我们最终得到的
是product_shop,而不是shop_product。
你可以使用artisan make:migration 命令来创建pivot 表,也可以通过Jeffrey Way 的扩展包Laravel 5 Generators Extended 中的artisan make:migration:pivot 命令。
Pivot 表字段:默认情况下,只需包含两个字段–分别对应两个表的外键,我们这里
是product_id和shop_id。
如果需要的话,你也可以添加跟多字段,后面我们会进行讨论。
多对多关系模型:BelongsToMany
我们已经有了数据库表和迁移,现在让我们为它们创建模型。
这里主要是分配一个多对多的关系,它可以在任何一个主表模型中定义。
选择1:app/Shop.php class Shop extends Model
{
/**
* The products that belong to the shop.
*/
public function products()
{
return $this->belongsToMany('App\Products');
}
} 选择2:app/Product.php class Product extends Model
{
/**
* The shops that belong to the product.
*/
public function shops()
{
return $this->belongsToMany('App\Shop');
}
}
实际上,你也可以都做,主要是看你在代码中如何使用这个关系–你需要$shop->products 还是$product->shops ,或者两者都需要。
现在的这个声明,Laravel会假设pivot 表命名遵守上面提到的规则,也就是product_shop 。
假如不是的话(比如是复数形式),你可以提供第二个参数:
public function products()
{
return $this->belongsToMany('App\Products', 'products_shops');
}
此外,你还可以指定pivot 表中字段的名称,如果它们不用于product_id 和shop_id 。
只需要添加两个参数:第一个是(中间表中代表)当前模型的字段,另一个是(中间表中代表)需要关联的模型的字段:
public function products()
{
//shop模型
return $this->belongsToMany('App\Products', 'products_shops',
'shops_id', 'products_id');
}
这里的一个主要好处是,你不需要创建一个单独的ProductShop 模型。
多对多关系管理:attach-detach-sync
现在已经准备好了数据表和模型,那么,现在的问题是我们如果只用两个模型而不用第三个中间模型来保存数据呢?看看下面几点。
例如,我们需要给当前商店(shop>) 实例添加一个商品(product) ,我们可以使用关系函数中的attach() 方法:
$shop = Shop::find($shop_id);
$shop->products()->attach($product_id);
结果就是我们会给product_shop表中添加新的一列,值分别为$product_id 和$shop_id 的值。
相似的,我们也可以解除( detach )一个关系,假设我们把一个商品从商店中移除:
$shop->products()->detach($product_id);
或者更进一步,删除一个特定商店中所有的商品,只需要调用该方法,不传递参数:
$shop->products()->detach();
你可以用过传递数组参数来附加和分离关系:
$shop->products()->attach([123, 456, 789]);
$shop->products()->detach([321, 654, 987]);
另一个非要有用的函数是更新整个pivot 表。
一个常见的例子是:管理面板中,一个商品下面有多个商店的多选框,在执行更新操作的时候,需要检查所有的商店,删除新的多选数组中不存在的,并添加或更新有的。
一件头疼的事情。
但现在不是了,有一个叫做sync() 的方法,它接受一个数组参数,然后会自动执行完所有的同步工作。
$product->shops()->sync([1, 2, 3]);
结果就是,不管之前product_shop 表中的值是怎么样的,调用该方法之后,只会有shop_id 是1、2、3的三行。
给Pivot 表添加额外列
我上面提到了,你很可能想给pivot 表添加额外的字段。
在我们的例子中,保存特定商店中商品的数量和时间戳是有必要的。
我们可以跟通常一样使用migration 来添加字段,但我们还需要对模型进行一些修改:
public function products()
{
return $this->belongsToMany('App\Products')
->withPivot('products_amount', 'price')
->withTimestamps();
}
你可以看到,我们能通过一个简单的withTimestamps() 方法来添加时间戳,以及通过给withPivot() 方法添加参数来添加额外的字段。
现在我们就可以在代码的循环中使用这些值了,有一个叫做pivot 的属性:
foreach ($shop->products as $product)
{
echo $product->pivot->price;
}
基本上,->pivot 表示pivot 中间表,并以此来访问我们提到的字段,如created_at 。
现在,如何在调用attach() 的方法是添加这些值呢?该方法接受另一个数组参数,你可以把所有需要的附加字段添加到其中。
$shop->products()->attach(1, ['products_amount' => 100, 'price' => 49.99]); 总结
因此,pivot 表可以非常方便的处理Eloquent 中的多对多关系,它不需要为这个中间表单独的创建一个模型。