Laravel支持多種數據庫,包括MySQL、Postgres、SQLite和SQL Server,在Laravel中鏈接數據庫和查詢數據庫都很是簡單,咱們可使用多種方式與數據庫進行交互,包括原生SQL語句、查詢構建器以及Eloquent ORM。本節咱們先演示如何使用原生SQL在Laravel應用中對數據庫進行增刪改查。php
百牛信息技術bainiu.ltd整理髮佈於博客園mysql
Laravel中數據庫配置文件爲config/database.php
,打開該文件,默認內容以下:laravel
<?php return [ //默認返回結果集爲PHP對象實例 'fetch' => PDO::FETCH_CLASS, //默認數據庫鏈接爲mysql,能夠在.env文件中修改DB_CONNECTION的值 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ //sqlite數據庫相關配置 'sqlite' => [ 'driver' => 'sqlite', 'database' => storage_path('database.sqlite'), 'prefix' => '', ], //mysql數據庫相關配置 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], //Postgres數據庫相關配置 'pgsql' => [ 'driver' => 'pgsql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ], //SQL Server數據庫相關配置 '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' => '', ], ], //遷移表名稱 'migrations' => 'migrations', //Redis數據庫相關配置 'redis' => [ 'cluster' => false, 'default' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 0, ], ], ];
若是要修改數據庫配置信息,去修改.env
對應值便可。咱們實例教程使用的Homestead開發環境默認配置,不作修改。若是你沒有使用Homestead,則須要根據本地配置修改相應配置值。redis
咱們在講Windows上安裝Homestead的時候,已經演示過數據庫鏈接測試,以及如何在本地使用Navicat鏈接Homestead的數據庫,這裏再也不贅述,下面直接進入如何使用數據庫進行增刪改查。sql
咱們在項目根目錄使用Artisan命令運行Laravel自帶的遷移生成users
表和password_reset
表:數據庫
對應在數據庫中生成三張表:json
咱們使用DB門面執行原生SQL語句,插入操做使用DB門面的insert
方法,代碼以下:數組
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use DB; class TestController extends Controller { /** * Display a listing of the resource. * * @return Response */ public function index() { DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )', [1, 'Laravel','laravel@test.com','123']); DB::insert('insert into users (id, name, email, password) values (?, ?, ?, ? )', [2, 'Academy','academy@test.com','123']); } }
在瀏覽器中輸入http://laravel.app:8000/test
,執行成功後在數據庫中插入兩條記錄:瀏覽器
查詢操做使用DB門面的select
方法,代碼以下:閉包
$user = DB::select('select * from users where id = ?', [1]); dd($user);
在瀏覽器地址欄輸入http://laravel.app:8000/test
,輸出內容以下:
能夠看到select
查詢返回的結果是數組。而數組中的每個元素都是PHP對象。
咱們還 能夠看到在執行查詢的時候使用了參數綁定,以免SQL注入。除此以外還可使用命名綁定:
$user = DB::select('select * from users where id = :id', [':id'=>1]);
效果同樣。
更新表記錄可使用DB門面的update
方法,該方法返回受影響的行數:
$affected = DB::update('update users set name="LaravelAcademy" where name = ?', ['Academy']); echo $affected;
打印結果爲1,若是沒有更新任何記錄則返回0。
刪除表記錄使用DB門面的delete
方法,和update
相似,該方法返回被刪除的行數:
$deleted = DB::delete('delete from users'); echo $deleted;
打印結果爲2,表數據都被咱們刪除了。
除了上述這些DML(insert/update/delete)和DQL(select)語句,SQL語句還包括DCL(create/drop等)和DDL(grant等),要運行後者,咱們能夠調用DB門面的statement
方法:
DB::statement('drop table users');
執行完該語句後,數據表users會被刪除。
除此以外,咱們還能夠經過DB門面的listen
方法監聽查詢事件,好比咱們在記錄日誌和調試的時候這會給咱們肯定問題提供便利,能夠在服務提供者的boot
方法中註冊該監聽器,例如咱們在AppServiceProvider
的boot
方法中定義監聽器以下:
/** * 啓動全部應用服務 * * @return void */ public function boot() { DB::listen(function($sql, $bindings, $time) { echo 'SQL語句執行:'.$sql.',參數:'.json_encode($bindings).',耗時:'.$time.'ms'; }); }
這樣咱們運行以下SQL語句:
DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )', [3, 'LaravelAcademy','laravel-academy@test.com','123']);
則瀏覽器會輸出以下內容:
SQL語句執行:insert into users (id, name, email, password) values (?, ?, ? , ? ),參數:[3,"LaravelAcademy","laravel-academy@test.com","123"],耗時:1.26ms
不少時候,咱們須要執行一連串操做,而其中任何一個操做出錯則整個流程失敗,須要回退重來,這個時候咱們就要用到數據庫事務。
DB門面提供兩種方式支持數據庫事務,一種是調用transaction
方法而後傳入閉包做爲參數,咱們將須要進行事務操做的邏輯放到閉包函數內:
DB::transaction(function () { DB::table('users')->update(['id' => 1]); DB::table('posts')->delete(); });
另外一種是 beginTransaction
、 rollBack
和 commit
三個方法一塊兒使用從而構建一個完整的事務操做:
DB::beginTransaction(); if($somethingIsFailed){ DB::rollback(); return false; } DB::commit();
此外,使用DB門面提供的事務還支持查詢構建器和Eloquent ORM數據庫操做。