Laravel之旅 - DB的操作(3) Relationships
已經說明DB Query和ORM操作的不同,
讓我們來聊聊 ORM 厲害的地方,
就是 relationships 的關聯設定,
可以很快速的join資料。
本文所採用的環境
- Max OSX 10.15
- Docker version 19.03.5
- Laradock
- Laravel 6.0 以上 (5.8適用)
本系列不從部署環境開始說起,
部署環境可參考以下
- Laradock - 更快速優雅的建立Laravel
- Install Apache, MySQL, PHP on macOS Catalina 10.15
- Win10請服用XAMPP,非專業版的Win裝docker會比較麻煩,不過也可以試試~~
本系列文章
Laravel之旅 - 認識Laravel資料夾結構
Laravel之旅 - 善用Migration管理資料表
Laravel之旅 - 生成Migration的懶人包
Laravel之旅 - DB的操作(1) DB Query builder
Laravel之旅 - DB的操作(2) Eloquent ORM
通常我們在資料比中的關聯,要不是1對1不然就是1對多,
通常遇到這種形態的資料時,往往第一個想到的是join這個DB語法,
在Laravel ORM中,則提供了快速的方法,可以進行join撈資料,
其實方法很簡單,只要到Model中建立function,並使用對應的語法即可。
1 | // 回到前幾篇提到的 User.php中加入以下 |
接著只要在Query的時候加上
1 | $post = User::where('name', 'Yee')->get()[0]->post; |
參照官方文件的方法如下,這樣的方法是可以再使用 relationships 取資料
1 | $post = App\User::find(1)->post; |
如果要取得所有使用者和使用者的所有post可以用迴圈這樣做
1 | $user = User::get(); |
也可以用預載入的方式
1 | User::with('post')->get() |
這樣就可以取得User這張表的資料,並且將每一筆資料都join上post這張表的資料,非常的方便和快速。
Relationships的部分官方文件中列了以下幾種方式
- One To One , hasOne()
- One To Many , hasMany()
- One To Many 逆向 , 即以B表取得A資料表, belongsTo()
- Many To Many , belongsToMany()
上面的這些寫法都是處在於
- A資料表的主鍵為”id”
- B資料表的外來鍵為”tableName_id”,
因為他會自動以 “tableName_id” 作為B資料表的外來鍵,
若不符合以上情境可以這樣寫
1 | return $this->hasMany('App\Post', 'foreign_key', 'local_key'); |
以上是我比較常用跟常見的操作方法,
更多方法可以看這邊Laravel - Eloquent: Relationships
後記
以前剛學laravel時,大多使用DB Query進行DB的操作,
後面接觸ORM後了解到他的快速後,大部分都使用ORM進行操作,
預載入的部分雖然比較快速,不過也是要看系統架構與情境,
只有符合情境才是最佳的操作。