iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
Modern Web

跳脫MVC,Laravel + React 建立電商網站系列 第 14

Day 14 淺談 拉拉維爾(Laravel) - Eloquent ORM

  • 分享至 

  • xImage
  •  

昨天講完Migration,今天要講的Model也是跟資料庫息息相關。Model其實從剛開始講Laravel就一直提到,那Model到底是什麼呢?
基本上可以把Model想像成一個Laravel來跟資料表溝通的一種模式,每一張資料表都會有一個自己的model
我們可以透過操作model的方式來完成CRUD。

當然,Model 做為一個有利於我們開發的小幫手,它也有一些特別的小特性來讓我們 "少作一些事情"
這裡依照官方文件記錄一些特性:
1. 如果我們在model之中沒有去指定$table的特別名稱,則預設為:類別名稱的小寫複數來當作映射的資料表名稱。
2. Model會預設每張資料表都有一個id欄位,並將其當作主鍵,當然也可以自行指定主鍵;另外預設主鍵為自動遞增的整數,如果希望資料表中的主鍵為非遞增或非數字時,可以定義public $incrementing = false; 用來關閉預設。
3. Model不支持複合主鍵(複合主鍵:有兩個key所組合成複合主鍵,白話文-兩個主鍵組成一個值,一起視為主鍵)
4. 在預設的情況下,Model會主動管理created_at以及updated_at(自動更新),如果不需要的話 可以設置public $timestamps = false;
5. 資料庫連線,在model的預設下會使用 mysql(這裡的mysql是定義的連線名稱,不是那隻海豚),如果有要連線其他資料庫,則可以在$connection 的地方設定連線名稱。連線的設定請參考 .env 以及 database 這兩個檔案來設置。

關於Model的關聯

既然Model跟(關聯式)資料庫息息相關,那我們也可以在Model上設定跟其他Model之間的關係,例如:一對一、一對多、多對一、多對多。
這些不同的關係,用關聯的好處是,當我們設定好關聯,在資料庫取回來的資料可以直接使用關聯的function來取得關聯資料。
Laravel 5.1 官方範例:

<?php 
namespace App; 
use Illuminate\Database\Eloquent\Model; 
class Book extends Model 
{ 
    /** 
     * 取得撰寫該書的作者。 
     */ 
    public function author() 
    { 
        return $this->belongsTo('App\Author'); 
    } 
}
$user = App\User::find(1); 
$user->posts()->where('active', 1)->get(); //這裡可以直接用posts來取得Post Model的資料

當然,關聯還有一個很棒的特性:預載入,這個功能雖然叫"預載入",但他其實是"延遲載入"的意思,使用預載入可以避免多次載入的問題

$books = App\Book::all(); 
foreach ($books as $book) { 
    echo $book->author->name; 
}

在這個情況下,假設N本書,這裡會執行N + 1次查詢(第一次取all、N次的關聯查詢)

$books = App\Book::with('author')->get(); 
foreach ($books as $book) { 
    echo $book->author->name; 
}

如果使用預載入,則會降低至兩次,實際上的查詢行為是:

select * from books 
select * from authors where id in (1, 2, 3, 4, 5, ...)

DataBase Query

上面有提到「我們可以將對資料庫的事情」改成在model做;那Laravel能不能寫原生的Sql語法?答案是可以的。
那為什麼要透過Model來操作資料表?基本上Model提供了很多能夠讓我們使用的功能,而這些功能都是封裝過的,因此我們可以降低重複寫程式碼的頻率
也能夠防止簡單的sql injection(我們可以寫一段code來操作Model,然後使用 ->tosql() 的方式dd出來,會發現Laravel把變數的地方都轉換成佔位符並使用參數化查詢的方式。

因此我自己在做專案開發的時候會比較傾向能用Model就用Model來操作,基本上Model的function有很,這裡列舉一些常用的:
1. where:就是基本Sql的where,使用方法:where('column',value)
2. whereIn:就是基本Sql的whereIn,使用方法 : whereIn('column' , array )
基本上就這兩個很常用,後續我們實作有用到再來補充XD

資料庫操作可以參考這裡(這裡的範例都是沒有用Model,如果有自己建立Model的話,可以將DB::table('users') 替換成User::,其他的使用方式都是一樣的)

在Laravel 的官方文件中有提到非常多不同的function以及各種情境的使用,我這邊就精簡的列出一些後續實作上比較常會用到的東西。
因為官方文件真的很長,有興趣的同學可以參考這裡。要是我全部都寫(翻)(譯)出來大概又是三天吧XD

已經接近一半了,我們明天見!


上一篇
Day 13 淺談 拉拉維爾(Laravel) - Migration
下一篇
Day 15 淺談 拉拉維爾(Laravel) - Blade
系列文
跳脫MVC,Laravel + React 建立電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言