Skip to main content

什麼是查詢建構器

Laravel 的查詢建構器(Query Builder)是以流暢介面建構並執行資料庫查詢的機制。從 DB facade 的 table() 方法開始,透過方法鏈組合查詢。
內部使用 PDO 參數綁定,SQL injection 對策會自動處理。
查詢建構器可在 Laravel 支援的所有資料庫(MySQL、MariaDB、PostgreSQL、SQLite、SQL Server)上運作。切換資料庫時可使用相同的程式碼。

與 Eloquent 的分工

取得資料

全部取得

get() 會回傳 Illuminate\Support\Collection。每筆記錄是 PHP 的 stdClass 物件。

取得單筆

以清單取得特定欄位值

大量資料的分塊處理

在 chunk 處理中要更新或刪除記錄時,請使用 chunkById() 而不是 chunk()chunk() 可能會產生記錄錯位。

串流(LazyCollection)

集計

記錄存在確認

SELECT 子句

WHERE 子句

基本條件

條件的分組

whereIn / whereBetween / whereNull

whereLike(樣式比對)

whereAny / whereAll(多欄位相同條件)

whereNullSafeEquals(NULL 安全等值比較)

whereNullSafeEqualsorWhereNullSafeEquals 在將欄位值與指定值比較時,將兩個 NULL 值視為相等 一般的 = 運算子中 NULL = NULL 會是 false,而 whereNullSafeEquals 則將 NULL 之間判定為相等。對應到 MySQL 的 <=> 運算子,以及 PostgreSQL 的 IS NOT DISTINCT FROM
一般的 where('column', null) 會轉為 WHERE column IS NULL,而 whereNullSafeEquals('column', $value) 不論綁定的值是否為 null 都能一致運作。特別適用於使用者輸入值可能為 null 的情境。

JOIN

子查詢 JOIN

排序、分組、限制

子查詢

Raw 表達式

Raw 表達式會作為 SQL 字串直接插入查詢中。直接傳入使用者輸入會有 SQL injection 風險。請務必使用綁定安全地撰寫。

INSERT / UPDATE / DELETE

INSERT

UPSERT(INSERT OR UPDATE)

UPDATE

DELETE

條件式查詢(when)

要動態套用查詢條件時,使用 when() 可讓條件分支寫得更整潔。

除錯

dd() 於除錯時方便,但絕不可用於正式環境。使用 toSql()getBindings() 確認 SQL 與 bindings 較為安全。

總結

查詢建構器比 Eloquent 更低階,回傳的不是 model 實例而是 stdClass。 當不需要 relation 或 model 事件(observer)時,查詢建構器更簡潔快速。
最後修改於 2026年8月2日