Sử dụng Migration và Seeder

Sử dụng Migration và Seeder hướng dẫn bạn dùng 2 công cụ quản lý database rất hay trong laravel là Migration và Seeder.

Sử dụng Migration trong Laravel

Migration là công cụ có sẵn trong Laravel giúp tạo và chỉnh sửa cấu trúc các table trong database rất dễ dàng. Mỗi migration là 1 file lưu trong folder database/migrations.

Mỗi migration được tạo ra để tạo hoặc chỉnh cấu trúc một table nào đó trong database.

Migration khi tạo xong có thể chạy để thực thi, chạy để rollback (hủy bỏ hành động) lại migration cũng được.

Migration rất cần thiết trong quá trình phát triển dự án, do nhu cầu điều chỉnh nhiều lần database, đặc biệt trong team nhiều người và làm việc xa nhau.

Tạo migration để Create Table

Để tạo migration cho mục đích tạo table (nhasanxuat), chạy lệnh như sau:

php artisan make:migration taotableNsx  --create=nhasanxuat
hoặc
php artisan make:migration create_nhasanxuat_table

Sau khi chạy lệnh trên, vào folder database/migrations sẽ thấy file migration mới được tạo ra.

Tạo migration để update table

Để tạo migration dùng cho mục đích chỉnh cấu trúc table (nhasanxuat), sử dụng lệnh như sau:

php artisan make:migration suatableNsx --table=nhasanxuat

Chạy lệnh xong thì vào folder database/migrations, bạn sẽ thấy migration mới được tạo.

Cấu trúc file migration

Mỗi file migration được Laravel tạo sẵn hai hàm: up() down(). Hàm up() dùng để tạo mới tables/columns còn hàm down () thực hiện ngược lại với up (xóa)

Bên trong 2 hàm up down, Bạn có thể code để tạo/sửa table với các field và thuộc tính cần thiết

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
public function up() {
   Schema::create('nhasanxuat', function (Blueprint $table) { 
      $table->id();
      $table->string('ten');
      $table->string('logo');
      $table->boolean('status');
      $table->timestamps();
      $table->charset = 'utf8mb4';
      $table->collation = 'utf8mb4_unicode_ci';
   });
}
public function down() {
     Schema::dropIfExists('nhasanxuat');
}
};

Các lệnh có thể dùng trong migration

Sau đây là một số lệnh thường dùng trong mirgration để khai báo các field và thuộc tính cho table:

  • $table->increments(‘id’); ➔ field id tăng tự động, unsigned integer
  • $table->id(); ➔ field id tang tự động, big Integer
  • $table->integer(‘soLuong’); ➔ field kểu integer , tên soLuong
  • $table->string(‘tenSP’, 100); ➔ field kiểu varchar, độ dài 100
  • $table->boolean(‘anHien’); ➔ field kiểu Boolean
  • $table->double(‘diemTB’, 8, 2); ➔ field kiểu số thực
  • $table->dateTime(‘thoiDiemMuaHang’); ➔ field kiểu ngày giờ
  • $table->charset = ‘utf8mb4’; ➔ Khai báo charset cho table
  • $table->collation = ‘utf8mb4_unicode_ci’; ➔ Khai báo collation cho table
  •  $table->timestamps(); ➔ Tạo 2 field created_at và updated_at

Tham khảo thêm tại: https://laravel.com/docs/migrations#creating-columns  

Thực thi migration

Để chạy tất cả các file migrations chưa được chạy, bạn mở command line, chuyển vào folder project rồi gõ lệnh

php artisan migrate

Roll back migration

Để rollback lại thao tác migration cuối cùng, bạn dùng lệnh php artisan migrate:rollback

Lệnh này sẽ rollback lại nhóm các migration được chạy lần gần nhất.

Reset và refresh migrations

Lệnh php artisan migrate:reset sẽ rollback lại tất cả migration của ứng dụng.

Lệnh php artisan migrate:refresh sẽ rollback lại toàn bộ migration và rồi chạy lệnh migrate.

Tạo table trong migration

Trong migration, dùng lệnh Shema::create để tạo table mới. Bạn viết nó trong hàm up với cú pháp như sau:

Schema::create('nhasanxuat', function(Blueprint $table){
    $table->id();
    $table->string('ten’);
    $table->string('logo’);
    $table->boolean('status');
    $table->timestamps();
    //...
    $table->charset = 'utf8mb4’;
    $table->collation = 'utf8mb4_unicode_ci’;
    $table->engine = 'InnoDB';
});

Tham số đầu tiên của create là tên table muốn tạo, còn tham số thứ hai là hàm khai báo các field và các thuộc tính của table.

Sửa cấu trúc table trong migration

Trong migration, lệnh Schema::table dùng để sửa cấu trúc table. Lệnh có cú pháp như sau:

Schema::table('nhasanxuat', function (Blueprint $table) {
    $table->boolean('status');
    $table->engine = 'MyISAM';
});

Tham số đầu tiên là tên table cần sửa, tham số thứ hai là nơi khai báo các field và các thuộc tính cần sửa của table Để test, tạo 1 migration update table và viết lệnh trong hàm up. Xong thì thực thi với lệnh php artisan migrate

Đổi tên, xóa table trong migration

Lệnh đổi tên table:

Schema::rename("nhasanxuat", "nsx");//from=>to

Lệnh xóa table

Schema::drop('nsx');
Schema::dropIfExists('nsx');

Để test, tạo 1 migration update table và viết lệnh trong hàm up. Xong thì thực thi với lệnh php artisan migrate

Chỉ định chạy một migration

Để chạy một migration cụ thể, thực hiện lệnh như sau:

php artisan migrate --path=database\migrations\tênFile.php

Vài lưu ý:

  • Bạn nuốn chạy lại 1 migration vừa mới chạy, có thể vào table migrations trong database và xóa dòng tương ứng với migration cần chạy.
  • Với 1 table cụ thể đã có, bạn muốn thêm 1 field created_at và updated_at thì tạo migration mới và code trong hàm up với lệnh timestamps() như sau
public function up() {
    Schema::table('products', function ( Blueprint $table) {
        $table->timestamps(); 
    });
}

Bài sử dụng Migration và Seeder hướng dẫn bạn dùng 2 công cụ tương tác database, vừa rồi là migration – công cụ để tạo/chỉnh cấu trúc database – rất cần cho team trong quá trình phát triển dự án. Sau đây là một công cụ khác giúp thêm/sửa/xóa dữ liệu: Seeder

Sử dụng Seeder trong Laravel

Seeder là công cụ trong Laravel giúp tạo dữ liệu trong các table một cách nhanh chóng và dễ dàng. Mỗi seeder là 1 file lưu trong folder database/seeders

Trong folder seeders, Laravel đã tạo sẵn một seeder với tên DatabaseSeeder để bạn dùng, nhưng có thể tạo nhiều seeder mới.

Mỗi seeder được tạo ra là để chèn, sửa, xóa dữ liệu trong các table của database.

Seeder rất cần thiết trong quá trình phát triển dự án, do nhu cầu cần có nhiều dữ liệu để trình bày trong trang web.

Tạo mới một seeder

Để tạo 1 seerder mới, dùng lệnh :

php artisan make:seeder NhaSanXuat

Sau khi chạy lệnh xong, Bạn vào folder database/seeders , sẽ thấy file mới tạo

Cấu trúc file Seeder

Mỗi file seeder được Laravel tạo sẵn một hàm: run(). Hàm này là nơi bạn viết code để thao tác trên dữ liệu trong các table (thêm, sửa, xóa)

Code tương tác db trong hàm run có thể dùng Query Buider hoặc Eloquent trong Laravel.

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class NhaSanXuat extends Seeder {
public function run() {
    \DB::table('nhasanxuat')->insert([
       'ten' => 'Samsung',
       'logo' => 'images/sanmsung.jpg',
       'status' => 1
    ]);
  }
}

Thực thi seeder

Để chạy seeder đã tạo, chạy lệnh sau trong folder project

php artisan db:seed --class=NhaSanXuat

Sau khi chạy xong, Bạn vào database sẽ thấy tác dụng:

Trong seeder có thể để chèn nhiều dòng dữ liệu cùng lúc:

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class NhaSanXuat extends Seeder {
public function run() {
    \DB::table('nhasanxuat')->insert([
       ['ten' => 'HTC','logo'=>'', 'status' => 1],
       ['ten' => 'Acer','logo'=>'','status' => 0],
       ['ten' => 'Lonovo','logo'=>'', 'status' => 2]
    ]);
}
}

Trong Seeder có thể phát sinh dữ liệu ngẫu nhiên

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class NhaSanXuat extends Seeder {
public function run() {
    for ($i=0; $i<50; $i++) {
       \DB::table('nhasanxuat')->insert([
           'ten' => 'Dell ' . rand(0,10),
           'logo'=>'',
           'status'=> rand(0,2)
       ]);
    }//for
}
}

Thực thi seeder mặc định

Trong ngữ cảnh đơn giản, bạn có thể không cần tạo seeder mới mà dùng luôn seeder có sẵn là DatabaseSeeder.

Để chạy seeder mặc định DatabaseSeeder của Laravel, bạn chỉ cần gõ lệnh sau trong command line:

php artisan db:seed

Tham khảo thêm tài liệu về sử dụng Migration và Seeder trong Laravel, bạn vào link này https://laravel.com/docs/9.x/migrationshttps://laravel.com/docs/9.x/seeding nhé. Còn bài cần tham khảo để biết tương tác với database là Sử dụng query builder trong Laravel