鍍金池/ 教程/ PHP/ 起步
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊列
調(diào)整器
分頁
文件系統(tǒng)/云存儲
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認(rèn)證
Artisan 控制臺
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯誤&日志

起步

1、簡介

Laravel 讓連接多種數(shù)據(jù)庫和運行查詢都變得非常簡單,不論使用原生 SQL、還是查詢構(gòu)建器,還是 Eloquent ORM。目前,Laravel 支持四種類型的數(shù)據(jù)庫系統(tǒng):

  • MySQL
  • Postgres
  • SQLite
  • SQL Server

1.1 配置

Laravel 讓連接數(shù)據(jù)庫和運行查詢都變得非常簡單。應(yīng)用的數(shù)據(jù)庫配置位于 config/database.php。在該文件中你可以定義所有的數(shù)據(jù)庫連接,并指定哪個連接是默認(rèn)連接。該文件中提供了所有支持?jǐn)?shù)據(jù)庫系統(tǒng)的配置示例。 默認(rèn)情況下,Laravel 示例環(huán)境配置已經(jīng)為 Laravel Homestead 做好準(zhǔn)備,當(dāng)然,你也可以按照需要為本地的數(shù)據(jù)庫修改該配置。

1.1.1 讀/寫連接

有時候你希望使用一個數(shù)據(jù)庫連接做查詢,另一個數(shù)據(jù)庫連接做插入、更新和刪除,Laravel 使得這件事情輕而易舉,不管你用的是原生 SQL,還是查詢構(gòu)建器,還是 Eloquent ORM,合適的連接總是會被使用。 想要知道如何配置讀/寫連接,讓我們看看下面這個例子:

'mysql' => [
    'read' => [
        'host' => '192.168.1.1',
    ],
    'write' => [
        'host' => '196.168.1.2'
    ],
    'driver'    => 'mysql',
    'database'  => 'database',
    'username'  => 'root',
    'password'  => '',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
],

注意我們在配置數(shù)組中新增了兩個鍵:readwrite,這兩個鍵都對應(yīng)一個包含單個鍵“host”的數(shù)組,讀/寫連接的其它數(shù)據(jù)庫配置選項都共用 mysql 的主數(shù)組配置。

如果我們想要覆蓋主數(shù)組中的配置,只需要將相應(yīng)配置項放到readwrite數(shù)組中即可。在本例中,192.168.1.1將被用作“讀”連接,而 192.168.1.2 將被用作“寫”連接。數(shù)據(jù)庫的憑證、前綴、字符集和所有 mysql 數(shù)組中的其它配置將會兩個連接共享。

2、運行原生 SQL 查詢

一旦你配置好數(shù)據(jù)庫連接后,就可以使用 DB 門面來運行查詢。DB 門面為每種查詢提供了相應(yīng)方法:select, update, insert, delete, 和 statement。

2.1 運行 Select 查詢

運行一個最基本的查詢,可以使用 DB 門面的 select 方法:

<?php

namespace App\Http\Controllers;

use 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 方法的第一個參數(shù)是原生的 SQL 語句,第二個參數(shù)需要綁定到查詢的參數(shù)綁定,通常,這些都是 where 字句約束中的值。參數(shù)綁定可以避免 SQL 注入攻擊。

select 方法以數(shù)組的形式返回結(jié)果集,數(shù)組中的每一個結(jié)果都是一個 PHP StdClass 對象,從而允許你像下面這樣訪問結(jié)果值:

foreach ($users as $user) {
    echo $user->name;
}

2.2 使用命名綁定

除了使用?占位符來代表參數(shù)綁定外,還可以使用命名綁定來執(zhí)行查詢:

$results = DB::select('select * from users where id = :id', ['id' => 1]);

2.3 運行插入語句

使用 DB 門面的 insert 方法執(zhí)行插入語句。和 select 一樣,改方法將原生 SQL 語句作為第一個參數(shù),將綁定作為第二個參數(shù):

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

2.4 運行更新語句

update 方法用于更新數(shù)據(jù)庫中已存在的記錄,該方法返回受更新語句影響的行數(shù):

$affected = DB::update('update users set votes = 100 where name = ?', ['John']);

2.5 運行刪除語句

delete 方法用于刪除數(shù)據(jù)庫中已存在的記錄,和 update 一樣,該語句返回被刪除的行數(shù):

$deleted = DB::delete('delete from users');

2.6 運行一個通用語句

有些數(shù)據(jù)庫語句不返回任何值,對于這種類型的操作,可以使用 DB 門面的 statement 方法:

DB::statement('drop table users');

2.7 監(jiān)聽查詢事件

如果你想要獲取應(yīng)用中每次 SQL 語句的執(zhí)行,可以使用 listen方法,該方法對查詢?nèi)罩竞驼{(diào)試非常有用,你可以在服務(wù)提供者中注冊查詢監(jiān)聽器:

<?php

namespace App\Providers;

use DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider{
    /**
     * 啟動所有應(yīng)用服務(wù)
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function($sql, $bindings, $time) {
            //
        });
    }

    /**
     * 注冊服務(wù)提供者
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

3、數(shù)據(jù)庫事務(wù)

想要在一個數(shù)據(jù)庫事務(wù)中運行一連串操作,可以使用 DB 門面的 transaction方法,如果事務(wù)閉包中拋出異常,事務(wù)將會自動回滾。如果閉包執(zhí)行成功,事務(wù)將會自動提交。使用 transaction方法時不需要擔(dān)心手動回滾或提交:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);
    DB::table('posts')->delete();
});

3.1 手動使用事務(wù)

如果你想要手動開始事務(wù)從而對回滾和提交有一個完整的控制,可以使用 DB 門面的 beginTransaction 方法:

DB::beginTransaction();

你可以通過 rollBack 方法回滾事務(wù):

DB::rollBack();

最后,你可以通過 commit 方法提交事務(wù):

DB::commit();

注意:使用 DB 門面的事務(wù)方法還可以用于控制查詢構(gòu)建器和 Eloquent ORM 的事務(wù)。

4、使用多個數(shù)據(jù)庫連接

使用多個數(shù)據(jù)庫連接的時候,可以使用 DB 門面的 connection 方法訪問每個連接。傳遞給 connection 方法的連接名對應(yīng)配置文件config/database.php中相應(yīng)的連接:

$users = DB::connection('foo')->select(...);

你還可以通過連接實例上的getPdo 方法底層原生的 PDO 實例:

$pdo = DB::connection()->getPdo();