1、串連資料庫
Laravel中資料庫設定檔為config/database.php,開啟該檔案,預設內容如下:
<?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,則需要根據本地配置修改相應配置值。
我們在講Windows上安裝Homestead的時候,已經示範過資料庫連接測試,以及如何在本地使用Navicat串連Homestead的資料庫,這裡不再贅述,下面直接進入如何使用資料庫進行增刪改查。
2、資料庫初始化
我們在項目根目錄使用Artisan命令運行Laravel內建的遷移產生users表和password_reset表:
對應在資料庫中產生三張表:
3、使用DB門面進行增刪改查
3.1 插入資料
我們使用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-insert-data
3.2 查詢語句
查詢操作使用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]);
效果一樣。
3.3 更新語句
更新表記錄可以使用DB門面的update方法,該方法返回受影響的行數:
$affected = DB::update('update users set name="LaravelAcademy" where name = ?', ['Academy']);
echo $affected;
列印結果為1,如果沒有更新任何記錄則返回0。
3.4 刪除語句
刪除表記錄使用DB門面的delete方法,和update類似,該方法返回被刪除的行數:
$deleted = DB::delete('delete from users');
echo $deleted;
列印結果為2,表資料都被我們刪除了。
3.5 通用語句
除了上述這些DML(insert/update/delete)和DQL(select)語句,SQL語句還包括DCL(create/drop等)和DDL(grant等),要運行後者,我們可以調用DB門面的statement方法:
DB::statement('drop table users');
執行完該語句後,資料表users會被刪除。
4、監聽查詢事件
除此之外,我們還可以通過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
5、資料庫事務
很多時候,我們需要執行一連串操作,而其中任何一個操作出錯則整個流程失敗,需要回退重來,這個時候我們就要用到資料庫事務。
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資料庫操作。