# 數據庫:入門
- [簡介](#introduction)
- [配置信息](#configuration)
- [數據庫讀寫鏈接](#read-and-write-connections)
- [使用多數據庫連接](#using-multiple-database-connections)
- [運行原生 SQL 語句](#running-queries)
- [監聽查詢事件](#listening-for-query-events)
- [數據庫事務](#database-transactions)
<a name="introduction"></a>
## 簡介
Laravel 通過使用原始 SQL 與數據庫的各種數據庫進行交互, 非常簡單。尤其流暢的使用 [查詢語句構造器](/docs/{{version}}/queries),和 [Eloquent ORM](/docs/{{version}}/eloquent)。當前,Laravel 支持四種類型的數據庫:
<div class="content-list" markdown="1">
- MySQL
- Postgres
- SQLite
- SQL Server
</div>
<a name="configuration"></a>
### 配置信息
Laravel 應用程序的數據庫配置文件放置在 `config/database.php` 文件中。在這個文件中,您可以定義所有的數據庫連接,并指定默認使用哪個連接. 在此文件內提供了大多數支持的數據庫系統示例。
默認情況下,Laravel 的[環境配置](/docs/{{version}}/configuration#environment-configuration) 示例會使用 [Laravel Homestead](/docs/{{version}}/homestead),這是一種方便的虛擬機,用于在本地機器上進行 Laravel 的開發。當然,您可以根據本地數據庫的需要隨意修改這個配置。
#### SQLite 配置
使用 `touch database/database.sqlite` 命令創建一個新的 SQLite 文件, 您可以通過使用數據庫的絕對路徑,輕松地配置環境變量,并指向這個新創建的數據庫:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
#### SQL Server 配置
Laravel 支持 SQL Server 數據庫; 無論以何種方式, 您都需要將數據庫的連接配置添加到您的 `config/database.php` 配置文件中:
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
],
<a name="read-and-write-connections"></a>
### 讀&寫的分離
有時您可能希望使用數據庫的一個連接,只用于 SELECT ,另一個用于 INSERT, UPDATE, 和 DELETE 。 在 Laravel 中無論你使用的是原始查詢,查詢語句構造器,還是 Eloquent ORM 你都能很輕松的實現.
如何配置讀/寫連接,讓我們看一下這個示例:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
注意,在上面的示例中,配置數組中添加了兩個鍵 : `read` 和 `write` 。這兩個鍵都包含了一個數組,鍵的值為: `host` 。`read` 和 `write` 連接的其余配置都在 `mysql` 這個主數組里面。
你只需要把項目放在 `read` 和 `write` 數組中,除非你想要覆蓋主數組的值。所以,在這種情況下,`192.168.1.1` 將用作「讀」連接的主機,而 `192.168.1.2` 將用于「寫」連接。這兩個連接會共享在 `mysql` 主數組中的配置。如:數據庫的憑證,前綴,字符集,以及其他的選項。
<a name="using-multiple-database-connections"></a>
### 使用多個數據庫連接
當使用多個連接時,您可以使用 `DB` facade 的 `connection` 方法。
通過 `config/database.php` 配置信息文件中定義好的數據庫連接,
將 `name` 做為 `connection` 這個方法的參數傳遞進去 :
$users = DB::connection('foo')->select(...);
您還可以使用 `getPdo` 方法訪問原始的PDO實例 :
$pdo = DB::connection()->getPdo();
<a name="running-queries"></a>
## 運行原生的 SQL 語句
配置好數據庫連接后,可以使用 `DB` facade 運行查詢。`DB` facade 為每種類型的查詢提供了方法:`select`,`update`,`insert`,`delete` 和 `statement` 。
#### 運行 Select
運行一個基礎的查詢語句,你可以使用 `DB` facade 的 `select` 方法:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 查詢應用中被激活的所有用戶列表
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
傳遞到 `select` 方法的第一個參數是一個原生的 SQL 查詢,而第二個參數則是傳遞的所有綁定到查詢中的參數值。通常,這些是 `where` 子句約束的值。參數綁定提供了對 SQL 注入的保護。
`select` 方法將始終返回一個數組結果集。數組中的每個結果將是一個PHP `StdClass` 對象,可以像下面這樣訪問結果值:
foreach ($users as $user) {
echo $user->name;
}
#### 使用命名綁定
除了使用 `?` 來表示參數綁定外,你也可以使用命名綁定運行查找:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
#### 運行 Insert
要執行 `insert` 語句,您可以在 `DB` facade 上使用 `insert` 方法。與select一樣,該方法將原始 SQL 查詢作為其第一個參數和綁定作為第二個參數:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
#### 運行 Update
`update` 方法用于更新數據庫中的已存在的記錄。該方法會返回此語句執行所影響的行數:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
#### 運行 Delete
`delete`方法用于從數據庫中刪除記錄。與 `update` 一樣,受影響的行數將被返回:
$deleted = DB::delete('delete from users');
#### 運行一般聲明
一些數據庫語句不返回任何值。對于這些類型的操作,您可以在 `DB` facade 上使用 `statement` 方法:
DB::statement('drop table users');
<a name="listening-for-query-events"></a>
### 查詢事件的監聽
如果你希望能夠監控到程序執行的每一條 SQL 語句,那么你可以使用 `listen` 方法。這個方法對于記錄查詢或調試非常有用。您可以將查詢偵聽器注冊到一個 [服務提供者](/docs/{{version}}/providers):
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 啟動應用服務。
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* 注冊服務提供者。
*
* @return void
*/
public function register()
{
//
}
}
<a name="database-transactions"></a>
## 數據庫事務
您可以在 `DB` facade 上使用 `transaction` 方法,在數據庫事務中運行一組操作。如果在事務 `Closure` 中拋出一個異常,那么事務將自動回滾。如果 `Closure` 成功執行,事務將自動被提交。您不需要擔心在使用事務方法時手動回滾或提交。
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
#### 處理死鎖
`transaction` 方法接受一個可選的第二個參數,該參數定義在發生死鎖時,應該重新嘗試事務的次數。一旦這些嘗試都用盡了,就會拋出一個異常:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
#### 手動操作事務
如果您想要手工開始一個事務,并且對回滾和提交有完全的控制,那么您可以在 `DB` facade 上使用 `beginTransaction` 方法:
DB::beginTransaction();
您可以通過 `rollBack` 方法回滾事務:
DB::rollBack();
最后, 您可以通過 `commit` 方法提交事務:
DB::commit();
> {tip} 使用 `DB` facade 的事務方法也適用于 [查詢語句構造器](/docs/{{version}}/queries) and [Eloquent ORM](/docs/{{version}}/eloquent)。
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
|---|---|---|---|
| [@孤雪飄寒](https://laravel-china.org/users/15752) | <img class="avatar-66 rm-style" src="https://dn-phphub.qbox.me/uploads/avatars/15752_1493141445.jpeg"> | 翻譯 | 全桟工程師,[Github](https://github.com/piaohan),[CSDN](http://blog.csdn.net/msmile_my)|
---
> {note} 歡迎任何形式的轉載,但請務必注明出處,尊重他人勞動共創開源社區。
>
> 轉載請注明:本文檔由 Laravel China 社區 [laravel-china.org](https://laravel-china.org) 組織翻譯,詳見 [翻譯召集帖](https://laravel-china.org/topics/5756/laravel-55-document-translation-call-come-and-join-the-translation)。
>
> 文檔永久地址: https://d.laravel-china.org
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- HomeStead
- Valet
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- 門面(Facades)
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- 重定向
- Session
- 表單驗證
- 錯誤與日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全
- 用戶認證
- API認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 交流說明