閒話很少說,直接起飛: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() 爲咱們提供了 大部分的功能,好比在修改的時候他會自動去找,若是沒有的去綁定或者刪除...