# 查詢連貫操作
### 介紹
數據庫查詢構建器為創建和運行數據庫查詢提供了方便,流暢的界面。它可用于在應用程序中執行大多數數據庫操作,并且可在所有受支持的數據庫系統上工作。
> **注意:**查詢構建器使用PDO參數綁定來保護您的應用程序免受SQL注入攻擊。無需清除作為綁定傳遞的字符串。
### [](https://octobercms.com/docs/database/query#joins)添加
#### 內部加入聲明
查詢構建器還可以用于編寫連接語句。要執行基本的SQL“內部聯接”,可以`join`在查詢構建器實例上使用該方法。傳遞給該`join`方法的第一個參數是您需要連接到的表的名稱,其余參數指定連接的列約束。當然,如您所見,您可以在單個查詢中聯接多個表:
~~~
$users = Db::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();
~~~
#### 左聯接/右聯接語句
如果要執行“左連接”或“右連接”而不是“內部連接”,請使用`leftJoin`或`rightJoin`方法。該`leftJoin`和`rightJoin`方法具有相同簽名的`join`方法:
~~~
$users = Db::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
$users = Db::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
~~~
#### 交叉加入聲明
要執行“交叉連接”,請使用`crossJoin`要交叉連接到的表的名稱的方法。交叉聯接在第一個表和聯接的表之間生成笛卡爾乘積:
~~~
$users = Db::table('sizes')
->crossJoin('colors')
->get();
~~~
#### 高級聯接語句
您也可以指定更高級的連接子句。首先,將a`Closure`作為第二個參數傳遞給`join`方法。該`Closure`會收到一個`JoinClause`對象,它允許你指定的約束`join`條款:
~~~
Db::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')->orOn(...);
})
->get();
~~~
如果要在聯接上使用“ where”樣式子句,則可以在聯接上使用`where`和`orWhere`方法。這些方法將比較列和一個值,而不是比較兩個列:
~~~
Db::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5);
})
->get();
~~~
#### 子查詢聯接
您可以使用`joinSub`,`leftJoinSub`和`rightJoinSub`方法加入查詢的子查詢。這些方法中的每一個都接收三個參數:子查詢,其表別名和定義相關列的Closure:
~~~
$latestPosts = Db::table('posts')
->select('user_id', Db::raw('MAX(created_at) as last_post_created_at'))
->where('is_published', true)
->groupBy('user_id');
$users = Db::table('users')
->joinSub($latestPosts, 'latest_posts', function ($join) {
$join->on('users.id', '=', 'latest_posts.user_id');
})->get();
~~~
### [](https://octobercms.com/docs/database/query#unions)工會
查詢構建器還提供了一種將兩個查詢“聯合”在一起的快速方法。例如,您可以創建一個初始查詢,然后使用該`union`方法將其與第二個查詢合并:
~~~
$first = Db::table('users')
->whereNull('first_name');
$users = Db::table('users')
->whereNull('last_name')
->union($first)
->get();
~~~
該`unionAll`方法也可用,并且具有與相同的方法簽名`union`。
### [](https://octobercms.com/docs/database/query#deletes)刪除內容
查詢構建器還可用于通過以下`delete`方法從表中刪除記錄:
~~~
Db::table('users')->delete();
~~~
您可以`delete`通過`where`在調用`delete`方法之前添加子句來約束語句:
~~~
Db::table('users')->where('votes', '<', 100)->delete();
~~~
如果您希望截斷整個表,這將刪除所有行并將自動遞增ID重置為零,則可以使用以下`truncate`方法:
~~~
Db::table('users')->truncate();
~~~
### [](https://octobercms.com/docs/database/query#pessimistic-locking)悲觀鎖定
查詢構建器還包括一些函數來幫助您對`select`語句執行“悲觀鎖定”。要使用“共享鎖”運行語句,可以`sharedLock`在查詢中使用該方法。共享鎖可防止在事務提交之前修改選定的行:
~~~
Db::table('users')->where('votes', '>', 100)->sharedLock()->get();
~~~
或者,您可以使用該`lockForUpdate`方法。“用于更新”鎖可防止修改行或使用另一個共享鎖選擇行:
~~~
Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
~~~
### [](https://octobercms.com/docs/database/query#caching-queries)緩存查詢
### [](https://octobercms.com/docs/database/query#persistent-caching)持久緩存
您可以使用“[緩存”服務](https://octobercms.com/docs/services/cache)輕松地緩存查詢結果。在準備查詢時,只需鏈接`remember`or`rememberForever`方法。
~~~
$users = Db::table('users')->remember(10)->get();
~~~
在此示例中,查詢結果將被緩存十分鐘。緩存結果時,將不會對數據庫運行查詢,并且將從為應用程序指定的默認緩存驅動程序中加載結果。
### [](https://octobercms.com/docs/database/query#in-memory-caching)內存中緩存
通過使用內存中緩存,可以防止在同一請求中出現重復查詢。默認情況下,此功能對[由模型準備的查詢](https://octobercms.com/docs/database/model#retrieving-models)啟用,但不對使用`Db`外觀直接生成的[查詢](https://octobercms.com/docs/database/model#retrieving-models)啟用。
~~~
Db::table('users')->get(); // Result from database
Db::table('users')->get(); // Result from database
Model::all(); // Result from database
Model::all(); // Result from in-memory cache
~~~
您可以使用`enableDuplicateCache`或`disableDuplicateCache`方法啟用或禁用重復緩存。
~~~
Db::table('users')->enableDuplicateCache()->get();
~~~
如果查詢存儲在緩存中,則在使用插入,更新,刪除或截斷語句時將自動清除查詢。但是,您可以使用該`flushDuplicateCache`方法手動清除緩存。
~~~
Db::flushDuplicateCache();
~~~
> **注意**:通過命令行界面(CLI)運行時,將完全禁用內存中緩存。
### [](https://octobercms.com/docs/database/query#debugging)調試
您可以在構建查詢時使用`dd`或`dump`方法來轉儲查詢綁定和SQL。該`dd`方法將顯示調試信息,然后停止執行請求。該`dump`方法將顯示調試信息,但允許請求繼續執行:
~~~
Db::table('users')->where('votes', '>', 100)->dd();
Db::table('users')->where('votes', '>', 100)->dump();
~~~
- 基本說明
- 基本操作
- October cms 安裝
- 后臺控制器路徑
- 圖標
- 獲取安裝網上的插件/主題
- 插件構造器使用
- 定時任務
- October后臺控制器
- vscode編輯器
- ajax操作
- 使用
- ajax更新組件
- ajax屬性API
- JavaScript API
- ajax綜合使用
- 主題
- 多語言主題
- 安裝市場主題
- 主題程序處理
- 主題
- 頁面
- 部件
- 布局
- 內容
- 組件
- 媒體
- 主題表單操作
- 表單使用
- 表單后端程序處理
- 插件
- 自定義插件
- 插件說明
- 插件導航條
- 插件數據庫設置
- 插件的設置管理
- 插件的配置文件config
- 組件
- app服務
- app容器
- 擴展行為
- 緩存
- Collection類
- Lazy Collections
- Collection方法
- 助手函數
- 數組助手函數
- 路徑助手函數
- 玄樂助手函數
- 其他助手函數
- 錯誤與記錄
- 事件處理
- HTML頁面
- 文件與目錄操作
- 散列和加密
- 郵件
- 郵件內容
- 郵件發送
- 分頁
- 模板解析器
- 動態解析器語法
- 隊列消息
- 請求與輸入
- 響應
- 視圖
- 路由器
- 配置
- 驗證操作
- 處理錯誤消息
- 錯誤消息與視圖
- 可用的驗證規則
- 有條件的驗證規則
- 驗證數組
- 錯誤消息
- 自定義驗證規則
- 模型操作
- 定義模型與其屬性
- 檢索模型
- 插入與更新
- 刪除模型
- 查詢范圍
- 事件操作
- 關聯操作
- 定義關系
- 關系類型
- 多肽關系
- 關系查詢
- 渴望加載
- 插入模型
- 數據庫操作
- 基本用法
- 數據表結構
- 查詢連貫操作
- 結果檢索
- select子句
- 插入更新
- where子句
- 排序,分組,限制和偏移
- 文件附件
- Collection操作
- 屬性操作
- 系列化json
- 數據庫屬性
- 數據庫行為
- 控制器
- 后臺控制器定義
- 后臺頁面
- 后臺組件
- 后臺表單
- 表單組件
- 表單視圖
- 表單行為
- 后臺列表
- 列表行為
- 列表過濾器
- 可用列類型
- 關系行為
- 關系行為類型
- 擴展關系行為
- 列表排序操作
- 導入導出操作
- 用于與權限
- corlate模板修改
- 修改頂部導航
- laravel問題
- 控制器不存在
- 控制器
- 路由組
- laravel筆記
- laravel 安裝
- 偽靜態配置
- 依賴注入 & 控制器
- 中間件
- 路由文件
- 視圖