Chúng ta đã xây dựng các trang tĩnh. Bây giờ, hãy nói về backend, cấu trúc cơ sở dữ liệu và dữ liệu, và cách Laravel xử lý chúng.
Bạn không cần phải tạo bảng DB với các cột một cách thủ công. Laravel sử dụng một khái niệm gọi là migrations để làm việc này. Bạn mô tả lược đồ migration trong một tệp migration và sau đó chạy migration, tạo bảng với các cột.
Các migration được thêm vào thư mục "database/migrations" . Khi bạn tạo một dự án Laravel mới, sẽ có ba tệp migration. Tệp migration quan trọng duy nhất khi học Laravel là tệp đầu tiên, nơi bảng Users được tạo. Thông thường, một tệp migration sẽ tạo một bảng. Framework tạo ba bảng trong một tệp migration, tất cả đều liên quan đến users.
database/migrations/0001_01_01_000000_create_users_table.php:
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
}
Chúng khá dễ đọc, ngay cả khi bạn không biết cách Migrations hoạt động. Đầu tiên, bạn định nghĩa tên bảng và tất cả các cột bên trong một closure.
Hãy xem các trường bên trong bảng "users":
- Trường "id", tự động là khóa chính và tự động tăng.
- Chuỗi cho các trường "name" và "email". Ngoài ra, email là duy nhất, vì vậy không thể bị trùng lặp.
- "rememberToken()" là một trường đặc biệt của Laravel để kiểm tra hộp "Remember me".
- "timestamps()" là một lối tắt cho hai trường: "created_at" và "updated_at". Chúng được tự động điền vào. Chúng ta sẽ thấy điều này sau.
Bây giờ, làm thế nào để thực hiện các Migrations này?
Nếu bạn sử dụng trình điều khiển cơ sở dữ liệu mặc định SQLite, các migrations sẽ được chạy tự động sau khi tạo dự án mới. Nếu bạn sử dụng bất kỳ trình điều khiển cơ sở dữ liệu nào khác, cơ sở dữ liệu ban đầu sẽ trống.
Để chạy các migrations, sử dụng lệnh artisan "php artisan migrate" trong terminal. Lệnh này sẽ chạy tất cả các migrations từ thư mục "database/migrations".
Trong DB client, chúng ta bây giờ có thể thấy tất cả các bảng đã được tạo.
Cách Thay Đổi Trình Điều Khiển Cơ Sở Dữ Liệu? Config và Env Variables.
Bây giờ, nếu bạn muốn thay đổi trình điều khiển cơ sở dữ liệu từ SQLite sang MySQL thì sao? Trước hết, hãy kiểm tra nơi lưu trữ các giá trị này. Chúng được lưu trong tệp cấu hình. Trong tệp "config/database.php", chúng ta có thể thấy khóa "connections" với các trình điều khiển DB khác nhau có sẵn như SQLite, MySQL, MariaDB, v.v.
Chúng ta có thể thấy các giá trị với helper "env()" trong mỗi driver. Helper này lấy các giá trị từ tệp ".env". Những giá trị đó được gọi là các biến môi trường. Nếu giá trị trong ".env" không được thiết lập, tham số thứ hai là giá trị mặc định.
Ví dụ, nếu bạn muốn sử dụng MySQL thay vì SQLite, trước hết trong tệp ".env", bạn nên thay đổi giá trị "DB_CONNECtiON" thành "mysql". Sau đó, bỏ chú thích các giá trị "DB_xxxxx" và đặt chúng nếu các giá trị mặc định không phù hợp với cấu hình của bạn. Các giá trị "DB_DATABASE", "DB_USERNAME" và "DB_PASSWORD" trong môi trường production nên được thay đổi.
Mẹo: không bao giờ sử dụng helper "env()" trong mã của bạn ngoài các tệp cấu hình.
Tạo Một Tệp Migration Mới
Hãy tạo một Migration cho bảng cơ sở dữ liệu có tên là "categories". Chúng ta có thể làm điều này bằng cách sử dụng lệnh "php artisan make:migration". Sau đó, như một tham số, chúng ta chỉ định "create [tên bảng] table" trong dấu ngoặc kép.
Bạn cũng có thể thấy một số tùy chọn cú pháp khác, như phân tách các hành động bằng ký tự gạch dưới thay vì từ với dấu ngoặc kép:
php artisan make:migration create_categories_table
Lệnh này tạo ra một lớp Migration mới trong thư mục "database/migrations" với hai cột mặc định: "id()" và "timestamps()".
database/migrations/xxx_create_categories_table.php:
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
// ... Your custom fields should go here
$table->timestamps();
});
}
Ví dụ, một category chỉ có một tên, vì vậy chúng ta sử dụng một cột string name.
database/migrations/xxx_create_categories_table.php:
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
"Undo": Lùi Lại Các Migrations
Mỗi lớp migration đều có hai phương thức: "up()" và "down()".
Phương thức "down()" có thể được chạy để lùi lại các migrations. Làm thế nào nó hoạt động? Khi bạn chạy lệnh artisan migrate, nó chỉ thực hiện migrations chưa được thực thi. Để làm điều đó, Laravel có một bảng gọi là migrations lưu trữ tất cả các migrations đã được chạy, cùng với số batch của chúng.
Khi chúng ta chạy migration, một bản ghi mới được chèn vào bảng categories với số batch là 2.
Lệnh rollback chỉ sẽ lùi lại các migrations của batch cuối cùng.
php artisan migrate:rollback
Trong cơ sở dữ liệu, chúng ta không có bản ghi trong bảng "migrations", và chúng ta cũng không có bảng "categories".
Kiểm tra Cấu Trúc Cơ Sở Dữ Liệu Hiện Tại
Trước khi kết thúc bài học này, một mẹo có thể hữu ích. Bạn có thể nhanh chóng xem thông tin về cơ sở dữ liệu và các bảng mà không cần mở SQL client của bạn. Sử dụng lệnh artisan sau:
php artisan db:show
Để xem thông tin về một bảng cụ thể, sử dụng "php artisan db:table" và cung cấp tên bảng.
Ghi chú. Ngay từ cái nhìn đầu tiên, bạn có thể nghĩ rằng hệ thống migration quá phức tạp. Bạn có thể tạo bảng thủ công bằng SQL client, đúng không?
Nhưng khi bạn cần triển khai lên production thì sao? Hoặc khi bạn làm việc trong một nhóm và cần chia sẻ cấu trúc của các bảng. Xuất/nhập SQL rất bất tiện. Vì vậy, migrations giúp chuyển tất cả các thay đổi cấu trúc DB và lịch sử của chúng một cách nhanh chóng.
Bài trước: Main Menu, Blade Structure và Static Pages
Bài tiếp: MVC: Model, Controller và View với Foreach
Cập nhật thêm được vài kiến thức mới
Bài viết hữu ích.
Hữu ích
Cảm ơn Admin. Bài viết khá hay !
OK bạn, mình sẽ sắp xếp viết một bài về Extend Validation. Cảm ơn bạn đã quan tâm nhé.