D10 - 深入 Laravel 的 Model,與資料庫暢快互動

閱讀時間約 16 分鐘

哈囉,大家好!在上一篇文章中,我們成功地使用 Laravel 的 Migration 建立了資料庫結構。現在,是時候來探索 Laravel 中的另一個重要組件:Model(模型)。

透過 Model,我們可以輕鬆地與資料庫互動,實現資料的讀取、寫入和關聯操作。

一、什麼是 Laravel 的 Model?

在 Laravel 中,Model 是應用程式與資料庫之間的橋樑。它使用了 Eloquent ORM(Object-Relational Mapping),讓我們可以用物件的方式來操作資料庫,而不需要撰寫繁瑣的 SQL 語句。

為什麼要使用 Model?

  • 簡化資料庫操作:透過 Model,我們可以輕鬆地進行 CRUD(Create、Read、Update、Delete)操作。
  • 物件導向:將資料庫中的資料映射為 PHP 物件,符合現代開發的最佳實踐。
  • 關聯關係:方便地定義和使用資料表之間的關聯,如一對多、多對多關係。
  • 提高可讀性:程式碼更加直觀,易於理解和維護。

個人經驗分享:還記得剛開始接觸 Laravel 時,對 Eloquent ORM 感到驚艷。以前需要寫大量的 SQL 語句,現在只需幾行程式碼就能完成。同時,程式碼的可讀性也大大提升,讓開發變得更輕鬆有趣。

二、建立 Model

1. 使用 Artisan 指令建立 Model

Laravel 提供了 Artisan 命令列工具,讓我們可以快速地生成 Model。

在終端機中執行以下指令:

php artisan make:model User

這將在 app/Models 目錄下建立一個 User.php 的檔案。

小提醒:Laravel 8 之後,Model 預設存放在 app/Models 目錄下。如果你使用的是較舊的版本,Model 可能位於 app 目錄下。

2. 為其他資料表建立 Model

按照同樣的方式,為我們的資料表建立相應的 Model。

  • 建立 BankAccount Model:
php artisan make:model BankAccount
  • 建立 Category Model:
php artisan make:model Category
  • 建立 Transaction Model:
php artisan make:model Transaction

現在,我們已經為每個資料表建立了對應的 Model。接下來,讓我們來設定這些 Model,使其與資料表正確對應。

三、設定 Model 與資料表的關係

1. 基本設定

Laravel 的 Eloquent 會自動推斷資料表名稱,例如,User Model 對應到 users 資料表。但有時候,我們的資料表名稱可能與預設規則不符,這時需要在 Model 中明確指定。

舉例來說,如果我們的資料表名稱是 bank_accounts,Eloquent 會自動將 BankAccount Model 對應到 bank_accounts 資料表。但為了保險起見,我們可以在 Model 中指定:

class BankAccount extends Model
{
protected $table = 'bank_accounts';
}

2. 指定主鍵

如果資料表的主鍵名稱不是 id,需要在 Model 中指定主鍵欄位。例如:

class User extends Model
{
protected $primaryKey = 'user_id';
}

3. 關閉時間戳記

如果資料表中沒有 created_at 和 updated_at 欄位,可以在 Model 中關閉時間戳記:

class Category extends Model
{
public $timestamps = false;
}

四、定義 Model 之間的關聯

資料表之間的關聯可以透過 Model 來定義,這是 Eloquent 強大的地方。接下來,我們將為各個 Model 定義關聯關係。

1. User Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
// 一個使用者有多個銀行帳戶
public function bankAccounts()
{
return $this->hasMany(BankAccount::class);
}

// 一個使用者有多個分類
public function categories()
{
return $this->hasMany(Category::class);
}

// 一個使用者有多筆交易
public function transactions()
{
return $this->hasMany(Transaction::class);
}
}

2. BankAccount Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class BankAccount extends Model
{
// 屬於一個使用者
public function user()
{
return $this->belongsTo(User::class);
}

// 一個銀行帳戶有多筆交易
public function transactions()
{
return $this->hasMany(Transaction::class);
}
}

3. Category Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
// 屬於一個使用者
public function user()
{
return $this->belongsTo(User::class);
}

// 一個分類有多筆交易
public function transactions()
{
return $this->hasMany(Transaction::class);
}
}

4. Transaction Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Transaction extends Model
{
// 屬於一個使用者
public function user()
{
return $this->belongsTo(User::class);
}

// 屬於一個銀行帳戶
public function bankAccount()
{
return $this->belongsTo(BankAccount::class);
}

// 屬於一個分類
public function category()
{
return $this->belongsTo(Category::class);
}
}

五、使用 Model 進行資料庫操作

現在,我們已經設定好了 Model 和關聯關係。接下來,讓我們來看看如何使用 Model 進行資料庫操作。

1. 新增資料(Create)

範例:新增一個使用者

$user = new User();
$user->username = 'john_doe';
$user->email = '[email protected]';
$user->password = bcrypt('secret');
$user->save();

範例:為使用者新增一個銀行帳戶

$bankAccount = new BankAccount();
$bankAccount->account_name = '薪資帳戶';
$bankAccount->account_number = '123456789';
$bankAccount->bank_name = '台灣銀行';

// 關聯到使用者
$user->bankAccounts()->save($bankAccount);

2. 查詢資料(Read)

範例:取得使用者的所有銀行帳戶

$user = User::find(1);
$bankAccounts = $user->bankAccounts;

範例:取得一筆交易的詳細資訊,包括使用者、銀行帳戶和分類

$transaction = Transaction::with(['user', 'bankAccount', 'category'])->find(1);

3. 更新資料(Update)

範例:更新銀行帳戶的餘額

$bankAccount = BankAccount::find(1);
$bankAccount->balance += 5000;
$bankAccount->save();

4. 刪除資料(Delete)

範例:刪除一個分類

$category = Category::find(1);
$category->delete();

5. 使用關聯進行操作

範例:透過使用者新增交易

$transaction = new Transaction([
'type' => 'expense',
'amount' => 2000,
'transaction_date' => now(),
'description' => '購買書籍',
]);

$user->transactions()->save($transaction);

六、還有沒有?

1. 使用 Eloquent 查詢構建器

Eloquent 提供了強大的查詢構建器,可以方便地進行各種複雜查詢。

範例:取得特定期間的收入總額

$totalIncome = Transaction::where('user_id', $user->id)
->where('type', 'income')
->whereBetween('transaction_date', [$startDate, $endDate])
->sum('amount');

2. 建立 Scope 簡化查詢

可以在 Model 中定義 Scope,讓常用的查詢條件更簡潔。

範例:在 Transaction Model 中定義 Scope

public function scopeIncome($query)
{
return $query->where('type', 'income');
}

public function scopeExpense($query)
{
return $query->where('type', 'expense');
}

使用 Scope 進行查詢

$totalIncome = Transaction::income()->sum('amount');
$totalExpense = Transaction::expense()->sum('amount');



3. 善用 Mutators 和 Accessors

可以在 Model 中定義 Mutators 和 Accessors,對欄位的值進行修改或格式化。

範例:在 User Model 中定義密碼的 Mutator

在模型中定義了一個名為 setPasswordAttribute 的方法時,這個方法會被自動觸發,因為 Laravel 提供了一個特性,允許開發者為模型屬性定義 "setter" 方法。這個 "setter" 方法會在你試圖為模型的屬性賦值時自動調用。

public function setPasswordAttribute($value)
{
$this->attributes['password'] = bcrypt($value);
}

這樣,當我們設定使用者密碼時,會自動進行加密:

$user->password = 'new_password'; // 會自動加密

具體原因:

  1. Laravel 的 Mutator 特性:
    在 Laravel 中,當模型的屬性被設定時,會檢查是否有對應的 Mutator(即 set{AttributeName}Attribute 方法)。在這個例子中,屬性名稱是 password,因此 Laravel 會檢查模型中是否有一個名為 setPasswordAttribute 的方法。這個方法的命名遵循以下規則:
    • set:前綴,表示這是 “setter” 方法。
    • Password:這是屬性的名稱,也就是模型中的 password 屬性。
    • Attribute:固定的後綴,Laravel 用於識別這個方法是屬性 Mutator。
  2. 自動加密密碼:
    當你給 $user→password 設置一個值時,Laravel 會自動調用 setPasswordAttribute 方法。在這個方法中,你可以定義如何處理這個值。你使用 bcrypt() 函數將明文密碼加密,然後再將加密後的值存儲到模型的 attributes 數組中,這個數組是用來保存模型的實際屬性值的。

小結

透過本篇文章,我們深入了解了 Laravel 的 Model 以及如何使用 Eloquent ORM 與資料庫進行互動。我們明白了:

  • 建立 Model 並設定與資料表的關係。
  • 定義 Model 之間的關聯,方便進行關聯操作。
  • 使用 Model 進行資料的新增、查詢、更新和刪除。
  • 善用 Eloquent 的特性,優化程式碼。
  • 當你有一定要讓某個欄位進行相關處理時Mutators 和 Accessors是最好的控制點
    希望這些內容能夠幫助你在開發中更加得心應手,寫出乾淨、可維護的程式碼。

But… 光是Model 就有很多可以講,但我們不要讓篇幅太多冗長,所以內容未來有機會,會在某個環節提出分享

Next

我們將開始開發後端 API,這部分開始會連通幾個關鍵行為,這樣會比較有脈絡。讓我們繼續這段充滿挑戰與樂趣的開發之旅吧!

這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,作者都用幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
發表第一個留言支持創作者!
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
好了,到了這個階段,我們終於要進入 Docker 的世界了!前幾篇文章我們討論了系統規劃與需求,現在來到實作的部分,要為整個開發環境打好基礎。這篇文章將帶你一步步打造出一個基於 Docker 的開發環境,裡面包含了 Laravel(後端)、Nuxt(前端)、Nginx(伺服器),以及 MariaDB
這篇文章介紹在 Laravel 中使用 Migration 管理資料庫結構,實現財務管理系統的資料表建立。Migration 提供版本控制、自動化管理和可移植性,方便開發者同步資料庫變更。還介紹了填充測試資料(Seeder)的操作,提高團隊協作效率。
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
好了,到了這個階段,我們終於要進入 Docker 的世界了!前幾篇文章我們討論了系統規劃與需求,現在來到實作的部分,要為整個開發環境打好基礎。這篇文章將帶你一步步打造出一個基於 Docker 的開發環境,裡面包含了 Laravel(後端)、Nuxt(前端)、Nginx(伺服器),以及 MariaDB
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
Thumbnail
第一份正職工作 在iot公司擔任後端工程師,一上工就使用先前沒用過的php/laravel,也馬上負責公司產品的架構規劃,先前資料庫只有簡單記載使用者跟使用者的一些設定,很多地方有資料不一致的問題,產品內容還有很多實體的關係沒有被定義進資料庫都是這次改版我要做的事情。 改版納入公司、機器
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
CodeIgniter 3 和 Laravel 是兩種不同的 PHP 框架,各有其特點和適用場景。CodeIgniter 3 是一個輕量級框架,Laravel 是一個功能強大的現代 PHP 框架,同樣都有Models的它們有什麼樣的差別呢?
Thumbnail
在本章節中,我們探討了 PHP 中如何引用和管理套件。學習了如何使用 Composer 來安裝第三方套件,以及如何引用自定義模組。此外,我們還介紹了如何創建和使用自定義套件,並列舉了一些在 PHP 社群中常見且廣泛使用的套件和庫。通過掌握這些知識,開發者可以更有效地管理和利用各種資源。
Thumbnail
這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
Thumbnail
第一份正職工作 在iot公司擔任後端工程師,一上工就使用先前沒用過的php/laravel,也馬上負責公司產品的架構規劃,先前資料庫只有簡單記載使用者跟使用者的一些設定,很多地方有資料不一致的問題,產品內容還有很多實體的關係沒有被定義進資料庫都是這次改版我要做的事情。 改版納入公司、機器
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更