Laravel框架学习笔记之数据同步操做(sync()的使用)

闲话很少说,直接起飞: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() 为咱们提供了 大部分的功能,好比在修改的时候他会自动去找,若是没有的去绑定或者删除...

相关文章
相关标签/搜索