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 安全等值比較)

whereNullSafeEquals 與 orWhereNullSafeEquals 在將欄位值與指定值比較時,將兩個 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

排序、分組、限制

子查詢

向量相似度搜尋

對於儲存嵌入向量的欄位,可以使用 whereVectorSimilarTo 只搜尋接近指定向量的記錄。向量欄位需在遷移中定義為 vector 型別(遷移中的向量欄位)。
whereVectorSimilarTo 會依相似度由高到低排列。若不需要指定最小相似度、只想明確以距離排序時,可以使用 orderByVectorDistance。若要在回傳的欄位中包含距離,可以透過 selectVectorDistance 指定別名。
這些方法會被轉換為資料庫提供的向量運算子。請確認所使用的資料庫支援向量型別與運算,並在 PostgreSQL 中啟用 pgvector 擴充功能。

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年9月21日