Cơ sở dữ liệu: Bắt đầu

Giới thiệu

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

Cấu hình

Cấu hình cơ sở dữ liệu nằm tại thư mục config/database.php. Trong file này bạn có thể định nghĩa tất cả các kết nối cơ sở dữ liệu, cũng như chỉ định connection nào là mặc định. Ví dụ hầu hết các hệ thống cơ sở dữ liệu đề cung cấp ở file này.

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.

Cấu hình SQLite

Sau khi tạo một cơ sở dữ liệu SQLite 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

Cấu hình SQL Server

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 cơ sở dữ liệu tại file cấu hình: config/database.php:

'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' => '',
],

Đọc & ghi các kết nối

Thỉnh thoảng bạn muốn sử dụng một kết nối cơ sử dữ liệu cho câu lệnh SELECT, một kết nối khác cho việc INSERT, UPDATE và DELETE. Laravel làm cho điều này quá dễ dàng và các kết nối 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 kết nối đọc / ghi thế nào, hãy xem 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: readwrite. 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 readwrite ẽ đượ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 readwrite 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", trong khi 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 kết nối.

Sử dụng nhiều kết nối cơ sở dữ liệu

Khi sử dụng nhiều kết nối cơ sở dữ liệu, bạn có thể truy cập vào mỗi kết nối qua phương thức connection trong DB facade. name truyền vào trong phương thức connection cần tương ứng với tên của kết nối 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();

Thực thi SQL thuần

Khi mà bạn đã cấu hình cho cơ sở dữ liệu, bạn có thể chạy các query sử dụng DB facade. DB facade 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 lệnh select

Để thực thi một query cơ bản, chúng ta cần sử dụng hàm select trong DB facade:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\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. 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;
}

Sử dụng Named Bindings

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 thi câu lệnh insert

Để 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à bindings ở tham số thứ hai:

DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);

Thực thi câu lệnh update

Hàm update sẽ được dùng để update các records đang có trong cơ sở dữ liệu. 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']);

Thực thi câu lệnh delete

Hàm delete cần được sử dụng để xoá các records khỏi cơ sở dữ liệu. Giống như update, số lượng dòng bị xoá sẽ được trả về:

$deleted = DB::delete('delete from users');

Thực thi một câu lệnh chung

Một vài câu lệnh cơ sở dữ liệu 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');

Listening tới các Query Events

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 Illuminate\Support\Facades\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()
    {
        //
    }
}

Database Transactions

Bạn có thể sử dụng phương thức transaction trong DB facade để chạy một set các hoạt động trong một database transaction. Nếu có một exception được ném ra trong transaction Closure, transaction sẽ tự động được rolled back. nếu Closure thực thi thành công, transaction sẽ tự động được committed. 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();
});

Thực hiện transaction thủ công

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 trong DB facade:

DB::beginTransaction();

Bạn có thể rollback lại transaction bằng hàm rollBack:

DB::rollBack();

Cuối cùng, Sử dụng hàm commit để commit một transaction:

DB::commit();

Sử dụng các hàm transactions của DB facade cũng có thể quản lý được transaction cho query builderEloquent ORM.

Nguồn: https://laravel.com/docs/5.3/database