Laravel框架學習筆記之資料同步操作(sync()的使用)

南丞發表於2018-01-26

閒話不多說,直接起飛:

使用場景:

在使用laravel框架開發的過程中,我們經常會遇到 三張表 之間 有關聯的操作,比如如下:

表1: 店鋪表 store

元素 型別 描述
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

注意:店鋪表與標籤表示多對多的關係

表列出來以後,然後我們會經常遇到一個這樣的操作:

新增一個店鋪,並且會在新增的時候給店鋪掛載標籤

面對這樣的需求 我們常規的做法是如下:

<?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() 為我們提供了 大部分的功能,比如在修改的時候他會自動去找,如果沒有的去繫結或者刪除...

相關文章