Migration giống như một hệ thống quản lý phiên bản giống như Git nhưng dành cho database. Migration cho phép bạn định nghĩa định nghĩa, cập nhật thay đổi các table trong Database. Đồng thời các thao tác với Database này còn có thể sử dụng trên các loại Database khác nhau như MySQL, SQL Server, Postgres, … mà không cần phải chỉnh sửa lại code theo Database sử dụng.
Điều kiện tiên quyết để chạy migration một cách thành công:
- Phải có kết nối với database .
- migrations muốn sử dụng được thì phải nằm trong thư mục App\database\migrations
1. Khởi tạo migration
php artisan make:migration migrationName
Ví dụ: tạo migration để tạo mới table flights
php artisan make:migration create_flights_table
Sau khi chạy command Laravel sẽ sinh ra cho các bạn một file có định dạng YYYY_MM_DD_HHMMII_migration_name.php
vào trong thư mục database/migrations
Trong quá trình xây dụng ứng dụng có thể file migration của bạn sẽ rất lớn, Laravel có cung cấp thêm cho các bạn một tính năng cho phép chúng ta squash tất cả các migration vào trong một SQL file. Để làm điều này trong Laravel các bạn chỉ việc sử dụng command
php artisan schema:dump
Trong trường hợp bạn vừa muốn squash vào file và xóa luôn hết migration hiện có thì bạn có thể sử dụng thêm tham số --prune
php artisan schema:dump --prune
SQL file được sinh ra sẽ nằm trong thư mục database/schema. Lúc này khi bạn thực hiện migrate data Laravel sẽ thực thi câu lệnh trong file SQL trước rồi sau đó mới thực thi những migration không được xuất hiện trong SQL file.
2. Cấu trúc của migration
Đây là cấu trúc của migration tạo bảng flights
ở ví dụ trên
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFlightsTable extends Migration {
/** * Run the migrations.
* * @return void */
public function up() {
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('flights');
}
}
Phương thức up
được sử dụng để thực thi code khi migrate data. Còn phương thức down
revert lại dữ liệu của phương thức up
, phương thức này sẽ được thực thi khi chúng ta thực hiện rollback migration
3. Thực thi migration
Để thực hiện migrate data các bạn sử dụng command:
php artisan migrate
Khi bạn thực thi migrate trên môi trường production thì sẽ hiện ra một promp để confirm xem bạn có thực sự muốn thực thi migrate data hay không, để đảm bảo dữ liệu của bạn không bị ảnh hưởng. Nếu bạn không muốn hiện promp khi thực thi migrate dữ liệu trên môi trường production, bạn có thể sử dụng thêm tham số --force
php artisan migrate --force
Trong trường hợp bạn muốn thực thi rollback migrate data về phiên bản trước đó, bạn có thể sử dụng command
php artisan migrate:rollback
Trong trường hợp bạn muốn rollback data về trước đó nhiều lần, bạn có thể sử dụng tham số --step
với giá trị là số lần bạn muốn rollback.
Ví dụ: Rollback data về 3 lần trước đó
php artisan migrate:rollback --step=3
Còn nếu như bạn muốn reset tất cả các migration, các bạn có thể sử dụng command:
php artisan migrate:reset
Trong trường hợp bạn vừa muốn rollback lại tất cả các migration và đồng thời migrate dữ liệu khi rollback thành công, các bạn có thể sử dụng command:
php artisan migrate:refresh
Nếu muốn chạy seed khi thực hiện refresh migration bạn có thể truyền thêm tham số –seed
php artisan migrate:refresh --seed
Nếu bạn muốn xóa hết table trong database và thực hiện migrate dữ liệu. Bạn có thể sử dụng command:
php artisan migrate:fresh
Nếu bạn muốn chạy thêm seed bạn có thể truyền thêm tham số --seed
php artisan migrate:fresh --seed
4. Sử dụng Schema Builder
4.1. Create table
Để tạo mới table trong Schema các bạn sử dụng phương thức create
với cú pháp:
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create($tableName, function (Blueprint $table) {
// ...
});
Ví dụ: Tạo mới table users
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->timestamps();
});
# Kiểm tra sự tồn tại của table, column
Kiểm tra sự tồn tại của table users
trong database
if (Schema::hasTable('users')) {
// The "users" table exists...
}
Kiểm tra xem column email
có tồn tại trong tables users
if (Schema::hasColumn('users', 'email')) {
// The "users" table exists and has an "email" column...
}
# Xác định connection của database
Tạo mới table users
trong connection sqlite
Schema::connection('sqlite')->create('users', function (Blueprint $table) {
$table->id();
});
Bạn cũng có thể thiết lập các thuộc tính cho table trong Closure
Ví dụ: Thiết lập engine cho table là InnoDB
Schema::create('users', function (Blueprint $table) {
$table->engine = 'InnoDB';
// ...
});
4.2. Update table
Sử dụng tương tự như create
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});
4.3. Đổi tên table
use Illuminate\Support\Facades\Schema;
Schema::rename($from, $to);
Trong đó:
$from
là tên của table các bạn muốn đổi tên.$to
là tên của table các bạn muốn đổi tên thành
4.4. Xóa table
Schema::drop('users');
//Hoặc
Schema::dropIfExists('users');
COLUMN TRONG TABLE
Ví dụ: Thêm column votes
vào trong table users
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
Schema::table('users', function (Blueprint $table) {
$table->integer('votes');
});
integer
: Kiểu dữ liệu
Mặc định, Laravel hỗ trợ chúng ta khoảng 60 phương thức hỗ các bạn tương tác với các cột với các kiểu dữ liệu khác nhau trong database. Vì nó cũng khá là nhiều nên mình cũng chỉ giới thiệu với mọi người các phương thức thường dùng thôi, còn chi tiết các bạn có thể lên trang chủ tham khảo thêm
bigIncrements()
, unsignedBigInteger()
, tinyInteger()
, unsignedTinyInteger()
string()
Phương thức này sẽ tạo ra một cột có kiểu dữ liệu là VARCHAR
với tham số thứ 2 là độ dài của string
$table->string('name', 100);
text()
$table->text('description');
timestamp()
$table->timestamp('added_at', $precision = 0);
Leave a Comment