iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

Laravel 與 Database 的相關檔案

在 Laravel 中,下面檔案與 Database 有關,是我覺得新手在練習時可以一起連著看的,建議在看官方文件的同時可以參考此篇概念,搭配文件一起閱讀:

https://ithelp.ithome.com.tw/upload/images/20230924/20162893sABva104fe.png

.env

.env 檔案會撰寫與 Database 設定相關資料,如:資料庫名稱、使用者名稱、使用者密碼等

Migration

Laravel 使用 migration 記錄對資料表的操作,而不是直接紀錄最終結果,有幾個重要的原因:

  1. 版本控制和協作:migration 允許團隊成員合作管理數據庫結構。通過 migration,可以輕鬆追蹤和分享對數據庫結構的變更。每個 migration 文件都有一個唯一的時間戳,因此可以確保變更的順序是一致的。這對於團隊協作和版本控制非常有幫助。
  2. 可回復(Rollback)操作:migration 不僅記錄了對資料表的操作,還包括了如何回復這些操作的邏輯。這代表可以輕鬆回滾到之前的數據庫結構狀態,而不需要手動撰寫 SQL 語句。這是測試、調整和維護數據庫結構的強大工具。
  3. 清晰的紀錄:migration 提供了一種清晰、結構化的方式來記錄數據庫變更。每個 migration 文件都包含了一組明確的操作步驟,這樣您和您的團隊可以很容易地理解和管理數據庫結構的演變。
  4. 跨不同數據庫系統的支持:Laravel 的 migration 系統支援多種數據庫系統,並提供了抽象層,使得可以在不同的數據庫中執行相同的 migration。如果直接紀錄最終結果,則不同數據庫系統之間的 migration 和回滾操作可能會變得複雜。

Seeder 和 Factory

我自己的翻譯:

Seeder = 種子資料

Factory = 生成資料的工廠

在 Laravel 專案開發階段時,由於 table 結構、資料欄位可能會因為考量到不同需求產生變動,Seeder 和 Factory 可幫助開發人員不用每次重新手動填寫數據進資料表,可以快速產生並注入相同或隨機資料。

我自己用下來很適合用在有關聯性的分類上,例如:自行車品牌與車種、購物的分類(美容、食品、生活用品),這類型由於更細的資料(如:產品)需要分屬於這些類別的資料。

Model

Model 是 Laravel 中的一個 Class,代表了數據庫表格的抽象。每個 Model 通常對應到數據庫中的一個表格,並提供了與該表格的映射和操作方法。Model 允許你以物件導向的方式處理數據,並使數據庫記錄變成可操作的物件。

每個 Model 通常對應到一個表格,並提供了與該表格的映射和操作方法。

例如: Product Model 對應到 products table

Query Builder

Query Builder 是 Laravel 提供的工具,用於生成和執行 SQL 查詢。它允許你以方法鏈式的方式建立和自訂查詢,而無需直接使用 SQL 語句。Query Builder 提供了一個方便且抽象的方法來與數據庫進行互動。

例如:使用 Query Builder 查詢所有價格低於 $500 的產品

$products = DB::table('products')
             ->where('price', '<', 500)
             ->get();

Eloquent ORM

Eloquent ORM 是 Laravel 中的 ORM 工具,它建立在 Query Builder 之上,並提供了更高級的、物件導向的方式來處理數據庫操作。Eloquent 將 Model 與數據表關聯,並提供了高級的數據庫操作方法。

例如:使用 Eloquent 查詢所有名稱包含 "Laptop" 的產品

$products = Product::where('name', 'like', '%Laptop%')->get();

菜鳥發問:什麼時候是 Query Builder,什麼時候又是 Eloquent ORM?

很多文章給的範例:

// Eloquent ORM,用 Product model 直接加上條件語句並取得資料
Product::where('price', '<', 100)->get();

// Query Builder,直接對 products table 進行條件搜尋與取得資料
DB::table('products', '<', 100)->get();

我自己很常碰到的問題,是如何分辨這兩個東西?明明是使用 Eloquent ORM ,用 dd() 查看結果時卻顯示 query builder。

原來在 Eloquent ORM 語句未結束前,實際上也是使用 Query Builder,因此才會有這樣子的結果。

// 只下了 where 條件,語句未結束
dd(Group::where('status', Group::STATUS_OPEN));

https://ithelp.ithome.com.tw/upload/images/20230924/20162893BHiqmIMrIJ.png

讓 Eloquent ORM 語句完整後,結果變成 Collection 物件

// 加上 get() 讓語句完整
dd(Group::where('status', Group::STATUS_OPEN)->get());

https://ithelp.ithome.com.tw/upload/images/20230924/20162893RG8PMpC7lO.png


小後記

寫到這篇有點迷失方向,又變回手把手的教學紀錄……

好在睡了一個午覺後重新冷靜下來,重新想了一下我想在鐵人賽的價值,才又產出這篇。

沒什麼的啦~四千多字整個打掉重來而已嘛(苦笑)

雖然我的文章不會教你寫 code,也不一定能呈現出我想帶來的價值,但我會繼續努力的💪!


上一篇
異常處理 Exception:Route Model Binding 無此資料的情況
下一篇
Migration & Table Plus 工具 (1)
系列文
Laravel 後端菜鳥可以知道的流程概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言