資料表設計和Eloquent

回歸基礎面談談怎麼開資料庫
還有 Laravel 怎麼和資料庫溝通

實務上使用關連式資料庫至少要做到
第一正規劃 (1NF)
  • 必須要有主鍵,並且欄位相依於主鍵
  • 每個欄位只有唯一值
  • 沒有一列資料是完全重複
其他2NF, 3NF有興趣的就自己研究
我也要找時間翻書複習了,如果有什麼頓悟或是心得可能會更新上來

再來看看 Laravel 怎麼溝通資料庫?
主要有兩種model,DB和Model(Eloquent)

DB

  • 輕量化的class
  • 同時支援raw sql以及eloquent style
  • 沒有model event
// eloquent mode
DB::table('users')->where('id', 1)->update('name', '城武');

// sql mode
DB::update("UPDATE users SET name='城武' WHERE id=1");


具有高度彈性,你可以寫出一些很奇葩的 query
但是太像義大利麵
江湖有句話:DB一時爽,維護火葬場

Model(Eloquent)

又稱作 class Model
  • ActiveRecord style (Ruby On Rails)
  • 語意比較明確
  •  Virtual Attribute
再來看看使用 class Model 實際怎麼操作資料庫

// 新增user,名字為城武
App\User::create(['name' => '城武']);

// 刪除ID為1的use
sql modeApp\User::where('id', 1)->delete();

Laravel Eloquent 提供了很多方便的語法
當然也可以在 create 方法直接塞入 json
但是此時所有 json 資料都會被儲存,如果使用者壞壞輸入惡意字元...

解決方法:

批量賦值

fillable 屬性指定了可以被批量賦值的欄位
這些欄位進來才會被允許
protected $fillable = ['first_name', 'last_name', 'email'];

還有另一個方法 guarded
和 fillable 相反,guarded 代表黑名單
這些欄位不能被寫入
protected $guarded = ['id', 'password'];

除此之外還有支援很多不同的 attribute
像是 primaryKey, incrementing 等等
可以到這邊看,看看 Collection.php 和 Model.php 沒有有造好的輪子

Virtual Attribute

用實際的例子來說,我們資料庫儲存了長、寬
而在 sql 中我們需要面積來計算
但是開一個欄位儲存面積又太浪費了
於是我們就產生一個 Virtual Attribute 作為面積
這是一個虛擬的屬性,不是資料庫中的欄位
但是又是一個欄位

以上就是這次的筆記


留言