iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 19
1
Software Development

網頁後端的30件小事系列 第 19

Laravel:save, attach, sync, toggle的差別

  • 分享至 

  • xImage
  •  

前言

在用Laravel ORM存資料時常常不確定該用哪個方法,有時候可以save有時候不行@_@
所以幫自己整理一下幾個方法的差別。

Save

編輯資料庫資料時可用。例如,我想把使用者表格第一筆資料的名字改成小華。

User::find(1)->save(['name'=>'小華']);

也可以一次編輯同筆資料內多個欄位的內容

User::find(1)->save([
	'name'=>'小華',
	'email'=>'flower@gmail.com'
	'sex'=>'male'
]);

多對多關係連結時

很多情況會用到多對多的表格,例如:一篇文章可以有多個標籤,一個標籤可以對應多篇文章。
為了符合資料庫正規化,在設計表格時,除了文章、標籤各一個表格,需要第3張表格連結這兩個表格。

  1. articles

    id article_name

    1|article1|
    2|article2|
    3|article3|
    4|article4|

  2. tags

    id tag_name

    1|tech|
    2|music|
    3|art|
    4|food|

  3. article_tag

    article_id tag_id

    1|2|
    1|3|
    1|4|
    3|4|

例如上面例子,文章1有music、art、food,3個標籤;而標籤food的有文章1、3,2篇文章。

Laravel提供多種方式去建立和控制這樣多對多的關係,包括最開始的save()也能用。

  • 建立:attach()、sync()、save()
  • 刪去:detach()
  • 切換:toggle()

用上面文章例子,如果要把文章3新增標籤tech和music的話,有幾種寫法:

Article::find(3)->tags()->attach([1,2]);
//結果會有三的標籤:1,2,4
Article::find(3)->tags()->sync([1,2],false);
//結果也會有三個標籤:1,2,4
//沒有false的話,結果會剩兩個標籤:1,2
Article::find(3)->tags()->saveMany([
	Tag::find(1),
	Tag::find(2)
]);
//save輸入的類型須為model
//多個時要用saveMany

有三個選項比較

方法 單個id 多個id 單個model 多個model
save() V 要用saveMany()
attach() V V V
sync() V V V

哪時候要寫括號,哪時候不用要注意。例如下面範例實作時tags要括號。

Article::find(1)->tags()->attach(1);

詳細測試可以看這篇(但他開頭的表格好像寫錯了):

Laravel 模型关联attach,save,sync方法参数类型验证_Coder_Chang的博客-CSDN博客

參考資料

Laravel 模型关联attach,save,sync方法参数类型验证_Coder_Chang的博客-CSDN博客

Laravel 5 - Many to Many - Attach versus Save

Eloquent: Relationships


上一篇
參數物件:物件導向的一種用法
下一篇
SQL:Join & View
系列文
網頁後端的30件小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言