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à Migrations
và Database 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
và --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()
vàdown()
. Hàmup
được sử dụng để tạo 1 bảng, cột, hay index chodatabase
. Hàmdown
sẽ làm ngược lại những hành động của hàmup
. - 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ácmigrations
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ờiseed
lại cácfile 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ệnhrefresh
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ẽrollback
vàmigrate
lại 5migrations
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ạimigrate
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ứcrun
. Phương thức này sẽ được thực thi khi các bạn chạy câu lệnhdb: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ụngQuery Builder
hoặc dùngEloquent 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ạyseeding
thì Laravel sẽ hiển thị ra mộtprompt
để xác nhận lại xem các bạn có thực sự muốn thực thiseeder
trênproduction
hay không. Nếu các bạn không muốn hiển thịprompt
mà muốnforce
chạy luônseed
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!!