Tìm hiểu về Database migrations và Seeding trong Laravel

Tìm hiểu về Database migrations và  Seeding trong Laravel

Trong quá trình làm một dự án hay một ứng dụng nào đó, việc chỉnh sửa và thay đổi cấu trúc hay thuộc tính của database rất dễ xảy ra. Khi làm việc nhóm việc các bạn thay đổi bất cứ thứ gì trong database cũng đều phải đồng bộ với tất cả các máy của các dev cùng làm với các bạn để đảm bảo nhất quán về DB. Việc này nếu làm thủ công thì sẽ rất mất thời gian chưa nói đến việc khó quản lý thay đổi của DB hay muốn rollback lại trạng thái DB trước đó cũng sẽ gặp rất nhiều khó khăn.
Chính vì vậy Laravel đã đưa ra một giải pháp và cung cấp công cụ đó là MigrationsDatabase Seeding giúp lập trình viên giải quyết vấn đề này.

1/ Kết nối với CSDL trong laravel

Trước tiên các bạn muốn sử dụng được công cụ Migrations thì các bạn phải tạo được project và kết nối được với DB. Dưới đây là cấu hình file .env kết nối với DB.

2/ Tạo migrations

- Để tạo migrations, các bạn sửa dụng Artisan Command `make:migration`:

$ php artisan make:migration create_users_table

File migration sẽ được tạo ở đường dẫn database/migrations. Mỗi tên file migration được sinh ra đều chứa nhãn thời gian timestamp để Laravel xác định được thứ tự của migrations.

Tùy chọn --table--create có thể được sử dụng để chỉ ra tên của bảng và migrations sẽ tạo một bảng mới.

Ví dụ:

$ php artisan make:migration create_users_table --create=users
$ php artisan make:migration add_email_to_users_table --table=users

3/ Cấu trúc migrations

  • Một lớp migration chứa 2 hàm up()down(). Hàm up được sử dụng để tạo 1 bảng, cột, hay index cho database. Hàm down sẽ làm ngược lại những hành động của hàm up.
  • Ví dụ một file migration tạo bảng users.
<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

4/ Chạy migrations

- Để chạy tất cả các migrations của bạn thì các bạn dùng câu lệnh Artisan migrate:

$ php artisan migrate


- Để chạy tất cả các migration theo đường dẫn file thì tùy vào các bạn đó là các bạn sử dụng câu lệnh với đường dẫn path mình ví dụ như sau: Nó sẽ thực hiện chạy tất cả các file có trong đường dẫn đó.

$php artisan migrate --path=app/foo/migrations

5/ Rollback migrations

- Để khôi phục lại lần thực hiện migration gần nhất`, Các bạn sử dụng câu lệnh rollback. Lệnh này sẽ quay lại "batch" migrations lần cuối cùng mà các bạn thực hiện.

$ php artisan migrate:rollback

- Các bạn có thể giới hạn số lượng migrations rollback bằng cách sử dụng tùy chọn `step`. Ví dụ như sau:

$ php artisan migrate:rollback --step=5

- Lệnh migrate:reset sẽ rolllback lại tất cả các migrations:

$ php artisan migrate:reset 

6/ Rollback và Migrate trong 1 câu lệnh

  • Lệnh migrate:refresh sẽ rollback toàn bộ các migrations của các bạn và thực hiện migrate lại từ đầu. Để thực hiện được việc đó các bạn sử dụng câu lệnh sau:
$ php artisan migrate:refresh
  • Tùy chọn --seed sẽ thực hiện đồng thời seed lại các file seeder của các bạn sau khi refresh lại database của các bạn. Các bạn thực hiện và sử dụng với câu lệnh sau:
$ php artisan migrate:refresh --seed
  • Tùy chọn step cung cấp tùy chọn bước cho lệnh refresh như bên trên mình đã có trình bày về tùy chọn step rồi.
    Ví dụ: lệnh sau sẽ rollbackmigrate lại 5 migrations gần nhất
$ php artisan migrate:refresh --step=5

7/ Drop all tables và migrate

  • Câu lệnh migrate:fresh sẽ drop tất cả các bảng trong database và chạy lại  migrate từ đầu:
$ php artisan migrate:fresh
  • Các bạn cũng có thể kèm theo tùy chọn seed:
$ php artisan migrate:fresh --seed

8/ Database: Seeding

- Seeder trong Laravel là class cho phép các bạn xử lý dữ liệu trong database. Class này sẽ hỗ trợ các bạn tạo ra data test, thay đổi cập nhật dữ liệu khi cần thiết.
- Tất cả các seeder trong Laravel đều được đặt trong thư mục database/seeders. Mặc định thì Laravel đã định nghĩa sẵn cho các bạn class DatabaseSeeder nằm sẵn trong thư mục trên. Và các bạn có thể sử dụng phương thức call để gọi các seeder khác khi cần thiết.

Tạo mới Seeder.

  • Để tạo mới một seeder trong Laravel các bạn có thể sử dụng command:
php artisan make:seeder SeederName

Trong đó: SeederName là tên của seeder các bạn muốn tạo.
VD: Mình sẽ tạo một UsersSeeder.

php artisan make:seeder UsersSeeder
  • Một Seeder class mặc định chỉ chứa duy nhất một phương thức run. Phương thức này sẽ được thực thi khi các bạn chạy câu lệnh db:seed. Trong phương thức này các bạn có thể viết logic để làm việc với DB như sử dụng Query Builder hoặc dùng Eloquent model factories.

VD: Mình sẽ sử dụng Query Builder insert thêm user trong UsersSeeder vừa tạo ở trên.

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;

class UsersSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
        ]);
    }
}
  • Để thực thi các seeder khác trong seeder nào đó các bạn có thể sử dụng phương thức call.

VD: Gọi UsersSeeder trong file DatabaseSeeder.

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
       $this->call([
           UsersSeeder::class
       ]);
    }
}

Chạy seeder.

  • Để thực thi các seeder trong Laravel các bạn sử dụng câu lệnh:
php artisan db:seed

Câu lệnh này sẽ thực thi Database\Seeders\DatabaseSeeder class.

Để thực thi một seeder cụ thể trong Laravel các bạn truyền thêm tham số --class với seeder class các bạn muốn chạy.

VD: Thực thi UsersSeeder.

php artisan db:seed --class=UsersSeeder
  • Khi ứng dụng qua bạn đang ở trên production, mà các bạn chạy seeding thì Laravel sẽ hiển thị ra một prompt để xác nhận lại xem các bạn có thực sự muốn thực thi seeder trên production hay không. Nếu các bạn không muốn hiển thị prompt mà muốn force chạy luôn seed các bạn có thể truyền thêm tham số --force.

VD:

php artisan db:seed --force

9/ Lời kết.

Trong quá trình phát triển dự án, việc thay đổi dữ liệu database và việc chỉnh sửa hay thay đổi cấu trúc các thuộc tính của database là điều không thể tránh khỏi, chính vì thế việc các bạn sử dụng migration và seeder sẽ hỗ trợ các bạn làm việc đó một cách đơn giản và hiệu quá. Giúp cho các bạn đỡ mất thời gian về thực hiện và tạo dữ liệu để test và thay đổi cấu trúc của database.

Thank you for reading!. Hẹn Gặp lại các bạn vào các bài tiếp theo!!