1. Mô tả dự án thực hành
Để việc tìm hiểu Laravel một cách có hiệu quả, chúng ta cùng nhau làm một dự án thực hành đơn giản theo phương pháp step by step.
Dự án được mô tả như sau:
- Một phòng trong công ty có nhiều Ban trực thuộc, mỗi Nhân viên của phòng được phân công vào một Ban.
- Ban có: tên Ban.
- Nhân viên có: mã nhân viên, họ tên, số điện thoại, năm sinh, email, thuộc Ban.
Yêu cầu: Viết phần mềm quản lý nhân sự của phòng với các chức năng sau:
- Thêm, xóa, sửa và hiển thị tất cả các Ban trong phòng.
- Thêm, xóa, sửa và hiển thị tất cả nhân viên.
Chú ý: Kiến thức chung về cơ sở dữ liệu và cách dùng MySQL không thuộc phạm vi của khóa học, các bạn tự tìm hiểu nhé.
2. Thiết kế dữ liệu cho dự án thực hành
Dự án có 2 bảng dữ liệu: bảng dữ liệu lưu thông tin Ban và bảng dữ liệu lưu thông tin Nhân viên.
- Bảng dữ liệu Ban (đặt tên là bans) gồm có 2 trường: ID kiểu integer và Tên Ban kiểu String.
- Bảng dữ liệu Nhân viên (đặt tên là nhanviens) có 7 trường:
- ID: kiểu integer.
- Mã nhân viên: kiểu String.
- Họ tên: kiểu String.
- Số điện thoại: kiểu String.
- Năm sinh: kiểu String.
- Email: kiểu String.
- ID của Ban (nhân viên thuộc Ban nào): kiểu integer.
- Vì Nhân viên thuộc Ban nên trường ID của Ban trong bảng dữ liệu Nhân viên sẽ liên kết khóa ngoại với ID trong bảng dữ liệu Ban.
3. Tạo các migration cho các bảng dữ liệu
Trong Laravel, các bảng cơ sở dữ liệu sẽ được khai báo theo cú pháp quy định trong một tính năng gọi là Migrations, sau đó chạy lệnh để tạo tự động các bảng cơ sở dữ liệu. Công cụ này giúp cho các lập trình viên quản lý các bảng dữ liệu tốt hơn, dễ dàng thay đổi cấu trúc bảng dữ liệu khi cần, các lập trình viên trong cùng dự án phối hợp với nhau dễ dàng hơn.
Mở CMD tại thư mục gốc của dự án và gõ 2 lệnh sau để tạo 2 migration:
php artisan make:migration create_bans_table php artisan make:migration create_nhanviens_table
Lưu ý: trong 2 lệnh trên, create_bans_table và create_nhanviens_table là tên 2 migration, trong đó các ký tự create_ và _table là quy ước cố định (bạn không nên thay đổi), các ký tự bans và nhanviens là tên của bảng dữ liệu mà migration sẽ tạo ra, bạn cần gán tên bảng ở vị trí này (tên của bảng cơ sở dữ liệu trong Laravel được quy ước là số nhiều nên thường được thêm chữ s phía sau). Phần còn lại là lệnh, bạn cần gõ lại chính xác.
Ghi chú: PHP đã được cài đặt để có thể chạy trong CMD tại bất kỳ thư mục nào.

Sau khi chạy lệnh, 2 file migration được tạo ra trong cấu trúc file như hình bên dưới.

Mở thử 1 file migration ta thấy nội dung như hình sau.

Chú thích:
- Chuỗi ký tự create_bans_table được dùng để tạo tên file 2019_06_21_084641_create_bans_table.php, phần trước là ngày giờ tạo migration.
- Chuỗi ký tự create_bans_table cũng được dùng để chuyển sang dạng camelCase để lấy làm tên class: CreateBansTable.
- Các ký tự ở giữa create_ và _table (ví dụ trong hình là bans) được dùng để làm tên bảng dữ liệu.
- Mặc định Schema để tạo bảng dữ liệu có sẵn 2 dòng:
- Dòng $table->bigIncrements(‘id’); cho biết rằng migration sẽ tạo 1 trường có tên id, kiểu dữ liệu UNSIGNED BIGINT (miền giá trị: từ 0 đến (2^64) – 1), AUTO_INCREMENT (tự động tăng khi INSERT).
- Dòng table->timestamps(); cho biết rằng migration sẽ tạo 2 trường có tên created_at và updated_at có kiểu dữ liệu TIMESTAMP để lưu thông tin thời gian tạo record và cập nhật record.
Để thêm các trường khác của bảng dữ liệu ta thường chèn các dòng giữa 2 dòng mặc định này.
3. Chỉnh sửa các migration theo thiết kế dữ liệu của dự án
Ta cần thêm các trường cho 2 bảng dữ liệu trong 2 file migration, nội dung thêm như code bên dưới, phần giải thích nằm phía dưới phần code.
Bảng bans
Schema::create('bans', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('ten_ban'); $table->timestamps(); });
Bảng nhanviens
Schema::create('nhanviens', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('ma_nhan_vien'); $table->string('ho_ten'); $table->string('so_dien_thoai')->nullable(); $table->string('nam_sinh')->nullable(); $table->string('email')->nullable(); $table->bigInteger('ban_id')->unsigned()->nullable(); $table->timestamps(); $table->foreign('ban_id')->references('id') ->on('bans')->onDelete('SET NULL'); });
Giải thích:
- Tạo trường ten_ban kiểu string, trong bảng bans.
- Tạo các trường ma_nhan_vien, ho_ten, so_dien_thoai, nam_sinh, email kiểu string, trong bảng nhanviens. Trong đó, các trường so_dien_thoai, nam_sinh, email cho phép null.
- Tạo trường ban_id kiểu unsigned big integer, trong bảng nhanviens, cho phép null.
- Tạo liên kết khóa ngoại từ trường ban_id (bảng nhanviens) liên kết với trường id của bảng bans với tùy chọn onDelete(‘SET NULL’), nghĩa là nếu xóa 1 ban, các nhân viên thuộc ban đó sẽ có ban_id = null.
4. Chạy các migration và kiểm tra kết quả
Chú ý: Để tránh lỗi trong 2 file migration đã tạo tự động: 2014_10_12_000000_create_users_table.php và 2014_10_12_100000_create_password_resets_table.php, bạn nên xóa 2 file này đi.
Tại thư mục gốc của dự án, mở CMD và chạy lệnh:
php artisan migrate
Sau khi chạy thành công, màn hình sẽ hiển thị như hình dưới.

Để kiểm tra các bảng dữ liệu đã tạo ra ta cần login vào PhpMyAdmin và vào cơ sở dữ liệu quanlynhansu như hình.

Cơ sở dữ liệu quanlynhansu đã có 3 bảng dữ liệu: bans, nhanviens và migrations.
Bảng dữ liệu migrations lưu trữ lịch sử chạy lệnh artisan migrate như hình bên dưới, các file migration đã được liệt kê trong bảng này thì lần sau chạy lệnh artisan migrate sẽ không được gọi lên chạy lại.

Còn dưới đây là hình chụp cấu trúc của 2 bảng dữ liệu bans, nhanviens.



Như vậy chúng ta đã dùng công cụ migration tạo thành công cơ sở dữ liệu cần thiết để chuẩn bị viết mã cho dự án.