Laravel làm cho việc kết nối tới các database và thực thi các query cực kì đơn giản với nhiều database back-ends thông qua sử dụng raw SQL, fluent query builder, và Eloquent ORM. Hiện tại, Laravel hỗ trợ sẵn bốn database sau:
- MySQL
- Postgres
- SQLite
- SQL Server
Laravel xử lý việc kết nối và thực thi các query rất đơn giản. Cấu hình cho database nằm trong file config/database.php
. Trong fil enayf, bạn có thể khai báo tất cả các database connections, cũng như chỉ định connection nào là mặc định.
Về mặc định, cấu hình môi trường ví dụ của Laravel đã có sẵn để dùng với Laravel Homestead, đây là một môi trường máy ảo hoàn hảo cho phát triển. Dĩ nhiên là bạn có thể hoàn toàn thoải mái thay đổi cấu hình này ứng với database trên máy bạn.
Sau khi tạo một SQLite database sử dụng câu lệnh như touch database/database.sqlite
, bạn có thể dễ dàng cấu hình biến môi trường để trỏ tới file được tạo này sử dụng đường dẫn tuyệt đối:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
Laravel hỗ trợ sẵn cho SQL Server; tuy nhiên bạn vẫn cần thêm vào thông số cấu hình cho database:
'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' => '',
],
Thi thoảng bạn muốn sử dụng một database connection cho câu lệnh SELECT, một connection khác cho việc INSERT, UPDATE và DELETE. Laravel làm cho điều này quá dễ dàng và các connections sẽ luôn được sử dụng nếu như bạn muốn thực thi raw query, query builder hay Eloquent ORM.
Để biết cấu hình cho các connection đọc / ghi thế nào, hãy coi ví dụ dưới đây:
'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' => '',
],
Chú ý là có hai khoá được thêm vào trong mảng cấu hình: read
và write
. Những khoá này có mảng giá trị chứa một key duy nhất: host
. Các thông số còn lại cho read
và write
sẽ được gộp từ mảng chính mysql
.
Vì thế, chúng ta chỉ cần đặt các items vào trong mảng read
và write
nếu chúng ta muốn ghi đè các giá trị này ở mảng chính. Do đó, ở trường hợp này, 192.168.1.1
sẽ được sử dụng cho kết nối read
, còn 192.168.1.2
được sử dụng cho kết nối write
. Các thông số về database như credentials, prefix, character set và các thông số khác trong mảng chính mysql
sẽ được dùng chung giữa các connection.
Khi mà bạn đã cấu hình cho database, bạn có thể chạy các query sử dụng DB
facade. DB
facade cung cấp các hàm để thực hiện các kiểu query: select
, update
, insert
, delete
, và statement
.
Để thực thi một query cơ bản, chúng ta cần sử dụng hàm select
:
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
Tham số thứ nhất truyền vào cho hàm select
là câu query thuần, trong khi tham số thứ hai là các giá trị binding cần được liên kết vào câu query. Về cơ bản, đây là những giá trị rằng buộc của mệnh đề where
. Liên kết parameter cung cấp việc bảo vệ chống lại SQL injection.
Hàm select
luôn trả về một array
kết quả. Mỗi kết quả trong mảng sẽ là một đối tượng PHP kiểu StdClass
, cho phép bạn truy xuất vào giá trị bên trong kết quả:
foreach ($users as $user) {
echo $user->name;
}
Thay vì sử dụng ?
để tượng trưng cho liên kết parameter, bạn có thể thực thi câu query sử dụng liên kết đặt tên:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Để thực hiện việc insert, bạn có thể sử dụng hàm insert
trong DB
facade. Giống như select
, hàm này nhận câu raw SQL query ở tham số đầu tiên, và liên kết ở tham số thứ hai:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Hàm update
sẽ được dùng để update các records đang có trong database. Số lượng row ảnh hưởng bởi câu lệnh sẽ được trả về qua hàm này:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Hàm delete
cần được sử dụng để xoá các records khỏi database. Giống như update
, số lượng dòng bị xoá sẽ được trả về:
$deleted = DB::delete('delete from users');
Một vài câu lệnh database không trả về giá trị gì cả. Với những thao tác kiểu này, bạn có thể sử dụng hàm statement
trong DB
facade:
DB::statement('drop table users');
Nếu bạn muốn nhận câu query SQL thực thi bởi ứng dụng, bạn có thể sử dụng hàm listen
. Hàm này hữu ích khi thực hiện log các query hay debug. Bạn có thể đăng kí query listener trong một service provider:
<?php
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
Để thực thi một tập các xử lý trong một database transaction, bạn có thể sử dụng hàm transaction
. Nếu một exception bị bắn ra từ trong transaction Closure
, transaction sẽ tự động được rollback lại. Nếu Closure
thực thi thành công, transaction sẽ tự động được commit. Bạn không cần phải lo lắng về việc thực hiện thủ công các thao tác roll back hay commit khi sử dụng hàm transaction
:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
Nếu bạn muốn thực hiện transaction thủ công và muốn quản lý việc rollback và commit, bạn có thể sử dụng hàm beginTransaction
:
DB::beginTransaction();
Sử dụng hàm rollback
để rollback transaction:
DB::rollBack();
Sử dụng hàm commit
để commit một transaction:
DB::commit();
Chú ý: Sử dụng các hàm transaction của
DB
facade cũng có thể quản lý được transaction cho query builder và Eloquent ORM.
Khi sử dụng nhiều connection, bạn có thể truy cập vào mỗi connection thông qua hàm connection
trên DB
facade. Giá trị name
truyền vào hàm connection
cần tương ứng với tên của connections trong file cấu hình config/database.php
:
$users = DB::connection('foo')->select(...);
Bạn cũng có thể truy cập vào trong phần raw, đối tượng PDO bên dưới sử dụng hàm getPdo
:
$pdo = DB::connection()->getPdo();