laravel支持四種數據庫:1、mysql,一個關系型數據庫管理系統;2、postgresql,一款“對象-關系”型數據庫管理系統;3、sqlite,一款輕型的關系型數據庫管理系統;4、SQL Server,一款關系型數據庫管理系統。
本教程操作環境:windows7系統、Laravel6版、Dell G3電腦。
Laravel 支持原生的 SQL 查詢、流暢的查詢構造器 和 Eloquent ORM 這些操作在各種數據庫后臺與數據庫的交互變得非常簡單。
目前 Laravel 支持以下四種數據庫:
-
MySQL 5.7+ :一個關系型數據庫管理系統,由瑞典MySQL AB?公司開發,屬于?oracle?旗下產品。
-
PostgreSQL 9.6+:一種特性非常齊全的自由軟件的對象-關系型數據庫管理系統,是以加州大學計算機系開發的POSTGRES,4.2版本為基礎的對象關系型數據庫管理系統。
-
SQLite 3.8.8+:一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它包含在一個相對小的C庫中。
-
SQL Server 2017+ :microsoft?公司推出的關系型數據庫管理系統
配置
數據庫的配置文件在 config/database.php 文件中,你可以在這個文件中定義所有的數據庫連接配置,并指定默認的數據庫連接。這個文件中提供了大部分 Laravel 能夠支持的數據庫配置示例。
默認情況下,Laravel 的示例 環境配置 使用了 Laravel Homestead(它是一種小型的虛擬機,能夠讓你很方便地在本地使用 Laravel 進行開發)。你可以根據本地數據庫的需要修改這個配置文件。
SQLite 配置
在使用 touch database/database.sqlite 一類的創建命令,創建了一個新的 SQLite 數據庫之后,你就可以使用數據庫的絕對路徑,配置環境變量來指向這個新創建的數據庫:
DB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite
若要為 SQLite 連接啟用外鍵約束,應將 DB_foreign_KEYS 環境變量設置為 true:
DB_FOREIGN_KEYS=true
URLs 形式配置
通常,數據庫連接使用多個配置值,例如 host、database、username、password 等。這些配置值中的每一個都有其相應的環境變量。這意味著在生產服務器上配置數據庫連接信息時,需要管理多個環境變量。
一些托管數據庫提供程序(如 Heroku)提供單個數據庫「URL」,該 URL 在單個字符串中包含數據庫的所有連接信息。示例數據庫 URL 可能如下所示:
mysql://root:password@127.0.0.1/forge?charset=UTF-8
這些?URLs?通常遵循標準模式約定: driver://username:password@host:port/database?options
為了方便起見,Laravel 支持這些 URLs,作為使用多個配置選項配置數據庫的替代方法。如果存在 url(或相應的 DATABASE_URL 環境變量)配置選項,則將使用該選項提取數據庫連接和憑證信息。
讀寫分離
有時候你希望 select 語句使用一個數據庫連接,而 INSERT、UPDATE 和 delete 語句使用另一個數據庫連接。在 Laravel 中,無論你是使用原生查詢,查詢構造器,還是 Eloquent ORM,都能輕松的實現。
為了弄明白讀寫分離是如何配置的,我們先來看個例子:
'mysql'?=>?[ ????'read'?=>?[ ????????'host'?=>?[ ????????????'192.168.1.1', ????????????'196.168.1.2', ????????], ????], ????'write'?=>?[ ????????'host'?=>?[ ????????????'196.168.1.3', ????????], ????], ????'sticky'?=>?true, ????'driver'?=>?'mysql', ????'database'?=>?'database', ????'username'?=>?'root', ????'password'?=>?'', ????'charset'?=>?'utf8mb4', ????'collation'?=>?'utf8mb4_unicode_ci', ????'prefix'?=>?'', ],
注意在以上的例子中,配置數組中增加了三個鍵,分別是 read、write 和 sticky。read 和 write 都包含一個鍵為 host 的數組。而 read 和 write 的其他數據庫選項都在鍵為 mysql 的數組中。
如果你想重寫主數組中的配置,只需要修改 read 和 write 數組即可。所以,這個例子中:192.168.1.1 和 192.168.1.2 將作為 「讀」 連接主機,而 192.168.1.3 將作為 「寫」 連接主機。這兩個連接會共享 mysql 數組的各項配置,如數據庫的憑證(用戶名 / 密碼),前綴,字符編碼等。
sticky 選項
sticky 是一個 可選值,它用于立即讀取在當前請求周期內已寫入數據庫的記錄。若 sticky 選項被啟用,并且當前請求周期內執行過「寫」操作,那么任何「讀」操作都將使用「寫」連接。這樣可確保同一個請求周期內寫入的數據可以被立即讀取到,從而避免主從同步延遲導致數據不一致的問題。不過是否啟用它,取決于應用程序的需求。
使用多數據庫連接
當使用多數據庫連接時,你可以通過 DB Facade 門面的 connection 方法訪問每一個連接。傳遞給 connection 方法的參數 name 應該是 config/database.php 配置文件中 connections 數組中的一個值:
$users?=?DB::connection('foo')->select(...);
你也可以使用一個連接實例上的 getpdo 方法訪問底層的 PDO 實例:
$pdo?=?DB::connection()->getPdo();
執行原生 SQL 查詢
一旦配置好數據庫連接后,便可以使用 DB facade 門面運行查詢。DB facade 為每種類型的查詢提供了相應的方法:select,update,insert,delete 和 statement。
執行 Select 查詢
你可以使用 DB Facade 的 select 方法來運行基礎的查詢語句:
<?php namespace AppHttpControllers; use AppHttpControllersController; use IlluminateSupportFacadesDB; 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 方法將始終返回一個 Array 數組,數組中的每個結果都是一個 stdClass 對象,可以像下面這樣訪問結果中的數值:
foreach?($users?as?$user)?{ ????echo?$user->name; }
使用命名綁定
除了使用 ? 表示參數綁定外,你還可以使用命名綁定的形式來執行一個查詢:
$results?=?DB::select('select?*?from?users?where?id?=?:id',?['id'?=>?1]);
執行 Insert 語句
你可以使用 DB Facade 的 insert 方法來執行 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');
運行未預處理的語句
有時你可能希望在不綁定任何值的情況下運行語句。對于這些類型的操作,可以使用 DB Facade 的 unprepared 方法:
DB::unprepared('update?users?set?votes?=?100?where?name?=?"Dries"');
請注意,這些語句不會像上面的語句那樣綁定值。它們可以打開你的應用程序進行 SQL 注入,應該非常小心地使用。
隱式提交
在事務中使用 DB 外觀的 statement 和 unprepared 方法時,必須小心避免導致 [隱式提交] 的語句 (https://dev.mysql.com/doc/refman/8.0/en/implicit-commit.html)。 這些語句將導致數據庫引擎間接提交整個事務,從而使 Laravel 不知道數據庫的事務級別。這種語句的一個例子是創建數據庫表:
DB::unprepared('create?table?a?(col?varchar(1)?null)');
請參考 MySQL 手冊中的觸發隱式提交的所有語句列表。
監聽查詢事件
如果你想監控程序執行的每一個 SQL 查詢,你可以使用 listen 方法。這個方法對于記錄查詢或調試非常有用。你可以在 服務提供器 中注冊你的查詢監聽器:
<?php namespace AppProviders; use IlluminateSupportFacadesDB; use IlluminateSupportServiceProvider; class AppServiceProvider extends ServiceProvider { /** * 注冊所有應用的服務 * * @return void */ public function register() { // } /** * 引導所有應用的服務 * * @return void */ public function boot() { DB::listen(function ($query) { // $query->sql ????????????//?$query->bindings ????????????//?$query->time ????????}); ????} }
數據庫事務
你可以使用 DB facade 的 transaction 方法在數據庫事務中運行一組操作。如果事務的閉包 Closure 中出現一個異常,事務將會回滾。如果事務閉包 Closure 執行成功,事務將自動提交。一旦你使用了 transaction, 就不必擔心手動回滾或提交的問題:
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();
技巧:DB facade 的事務方法同樣適用于 查詢構造器 和 Eloquent ORM。
連接到數據庫 CLI
如果要連接到數據庫的 CLI,可以使用 db Artisan 命令:
php?artisan?db
如果需要,可以指定數據庫連接名稱以連接到不是默認連接的數據庫連接:
php?artisan?db?mysql
【相關推薦:laravel視頻教程】