閒話不多說,直接起飛:
使用場景:
在使用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() 為我們提供了 大部分的功能,比如在修改的時候他會自動去找,如果沒有的去繫結或者刪除...