闲话很少说,直接起飞:php
使用场景:laravel
在使用laravel框架开发的过程当中,咱们常常会遇到 三张表 之间 有关联的操做,好比以下:数组
表1: 店铺表 storebash
元素 | 类型 | 描述 |
---|---|---|
store_id | int | 主键 |
store_name | varchar(255) | 名称 |
表2: 店铺标签表 tag框架
字段 | 类型 | 描述 |
---|---|---|
tag_id | int | 主键 |
tag_name | varchar(255) | 属性名称 |
表3: 店铺与标签的关系表 tag_group测试
字段 | 类型 | 描述 |
---|---|---|
tag_id | int | 标签id |
store_id | int | 店铺id |
注意:店铺表与标签表示多对多的关系ui
表列出来之后,而后咱们会常常遇到一个这样的操做:this
添加一个店铺,而且会在添加的时候给店铺挂载标签spa
面对这样的需求 咱们常规的作法是以下:code
<?php
//首先从表单中传递过来一个数组:
$param['store_name']='测试店铺';//这是接收的店铺名字
$data['tag_ids'] = [1,3,4,5];//这是选择的标签的id数组
//而后首先 店铺表中插入一条数据
$result = Store::create($param);
//var_dump($result);
//遍历选择的标签数组 绑定标签与店铺之间的关系
if(count($data['tag_ids'])>0) {
foreach ($data['tag_ids'] as $value) {
$res[] = TagGroup::create(['store_id'=>$result->store_id,'tag_id'=>$value]); //绑定关系
}
}
?>
复制代码
按照上面的代码写下来 估计在修改的店铺标签的时候 估计会炸掉! 由于首先要查 这个标签绑定过没 绑定了的 要删除 并把没有绑定过的再绑定上 多麻烦 因此 有需求就有解决方案! 以下所示咱们使用 sync() 来作关系:
<?php
//首先从表单中传递过来一个数组:
$param['store_name']='测试店铺';//这是接收的店铺名字
$data['tag_ids'] = [1,3,4,5];//这是选择的标签的id数组
//而后首先 店铺表中插入一条数据
$result = Store::create($param);
//var_dump($result);
//这里咱们不须要遍历了 只须要这样写
$res = $result->tag->sync($data['tag_ids']);
?>
复制代码
接下来咱们须要在 Stroe model中 去定义一个关联模型
<?php
class Store extend Model{
public function tag() {
return $this->belongsToMany(Tag::class,'tag_group','tag_id','store_id');
}
}
?>
复制代码
这样 咱们就能够 很方便的去给店铺 挂载标签 或者属性, sync() 为咱们提供了 大部分的功能,好比在修改的时候他会自动去找,若是没有的去绑定或者删除...