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:[email protected]/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 App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\DB; 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 App\Providers; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; 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支援什麼資料庫的詳細內容,更多請關注TW511.COM其它相關文章!