Creating MySQL Procedure in Laravel 5.4 Migrations

Chào các bạn, ở bài viết hôm nay mình sẽ hướng dẫn cách tạo và sử dụng procedure trong Laravel với cơ sở dữ liệu MySQL. Hiểu đơn giản thì Stored procedure được định nghĩa như một tập các khai báo sql được lưu trữ ngay trong cơ sở dữ liệu và sau đó, được triệu gọi bởi một program, một trigger hay thậm chí là một stored procedure khác. Từ “thuở sơ khai”, MySQL không hỗ trợ stored procedure, trigger hay event…Từ phiên bản 5.0 trở lên, những chức năng này mới được thêm vào MySQL Database Engine với mục đích đem lại tính linh động và mạnh mẽ hơn cho MySQL. Mình xin điểm qua một số lợi ích khi sử dụng procedure:

  1. Stored procedure làm tăng khả năng thực thi của ứng dụng. Sau khi được tạo, stored procedure sẽ được biên dịch và lưu trữ ngay trong database. Lẽ dĩ nhiên, nó sẽ chạy nhanh hơn là một lệnh sql chưa compile được gọi trực tiếp từ ứng dụng.
  2. Stored procedure làm giảm lưu lượng thông tin giao tiếp giữa ứng dụng và database server, thay vì gởi những câu lệnh sql chưa complile dài lằng ngoằn, ứng dụng chỉ việc gởi tên của stored procedure và lấy lại kết quả.
  3. Stored procedure có thể được tái sử dụng và chuyển sang bất cứ ứng dụng nào muốn sử dụng chúng...

OK, bây giờ mình sẽ tạo procedure và gọi nó trong Laravel nhé: Đầu tiên mình sẽ tạo file migration để thêm mới một procedure vào Database MySQL.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProcedure extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::unprepared('
            CREATE PROCEDURE fetch_all_users()
            BEGIN
                select * from users;
            END'
        );
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::unprepared('DROP PROCEDURE IF EXISTS fetch_all_users');
    }
}

Sau đó mình chạy migrate để tạo procedure:

php artisan migrate

Tiếp đến mình sẽ gọi nó như sau:

DB::select('call fetch_all_users()')

Tất nhiên sẽ có trường hợp các bạn muốn tạo procedure có truyền tham số đầu vào, mình sẽ sửa lại migration như sau:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateProcudureWithParams extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        DB::unprepared('
            CREATE PROCEDURE fetch_users_with_name(IN userName VARCHAR(255))
            BEGIN
                select * from users where name = userName;
            END'
        );
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        DB::unprepared('DROP PROCEDURE IF EXISTS fetch_users_with_name');
    }
}

Chạy migrate để tạo procedure:

php artisan migrate

Tiếp đến gọi procedure trong Laravel như sau:

DB::select('call fetch_users_with_name("Dr. Saul Goodwin II")')

Ngày xưa khi làm .NET với hệ quản trị cơ sở dữ liệu SQL Server thì rất hay dùng procedure và function nhưng từ khi sang code PHP, MySQL thì ít dùng mấy cái này. Hi vọng bài viết sẽ sẽ hữu ích cho các bạn. Cảm ơn