exec(" CREATE TABLE IF NOT EXISTS `students` ( `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `email` VARCHAR(255) NOT NULL UNIQUE, `age` INT UNSIGNED NOT NULL DEFAULT 18, `gender` ENUM('male', 'female') NOT NULL DEFAULT 'male', `created_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; "); // Tự động kiểm tra và ALTER TABLE bổ sung cột class_name nếu chưa có $colCheck = $pdo->query("SHOW COLUMNS FROM `students` LIKE 'class_name'")->fetch(); if (!$colCheck) { $pdo->exec("ALTER TABLE `students` ADD COLUMN `class_name` VARCHAR(50) NULL DEFAULT 'CNTT-K18A' AFTER `gender`"); $alterMsg = 'Đã thực thi ALTER TABLE bổ sung cột `class_name` vào bảng `students` thành công!'; } // Seed hoặc cập nhật lại class_name khi người dùng bấm nút hoặc bảng trống $count = (int) $pdo->query("SELECT COUNT(*) FROM `students`")->fetchColumn(); if ($count === 0 || isset($_POST['run_migrate_seed'])) { $pdo->exec(" INSERT IGNORE INTO `students` (`id`, `name`, `email`, `age`, `gender`, `class_name`, `created_at`, `updated_at`) VALUES (1, 'Nguyễn Văn An', 'an.nguyen@example.com', 20, 'male', 'CNTT-K18A', NOW(), NOW()), (2, 'Trần Thị Bích Ngọc', 'ngoc.tran@example.com', 19, 'female', 'CNTT-K18A', NOW(), NOW()), (3, 'Lê Hoàng Nam', 'nam.le@example.com', 17, 'male', 'KTPM-K19B', NOW(), NOW()), (4, 'Phạm Minh Châu', 'chau.pham@example.com', 21, 'female', 'HTTT-K17A', NOW(), NOW()), (5, 'Hoàng Đức Trọng', 'trong.hoang@example.com', 22, 'male', 'CNTT-K18B', NOW(), NOW()), (6, 'Vũ Thị Mai Hương', 'huong.vu@example.com', 17, 'female', 'KTPM-K19A', NOW(), NOW()), (7, 'Đặng Quốc Khánh', 'khanh.dang@example.com', 20, 'male', 'ANM-K18A', NOW(), NOW()), (8, 'Bùi Thanh Hà', 'ha.bui@example.com', 19, 'female', 'CNTT-K18A', NOW(), NOW()), (9, 'Đỗ Gia Bảo', 'bao.do@example.com', 16, 'male', 'KTPM-K19B', NOW(), NOW()), (10, 'Ngô Phương Linh', 'linh.ngo@example.com', 21, 'female', 'HTTT-K17A', NOW(), NOW()); "); $pdo->exec("UPDATE `students` SET `class_name` = 'CNTT-K18A' WHERE `id` IN (1, 2, 8)"); $pdo->exec("UPDATE `students` SET `class_name` = 'KTPM-K19B' WHERE `id` IN (3, 9)"); $pdo->exec("UPDATE `students` SET `class_name` = 'HTTT-K17A' WHERE `id` IN (4, 10)"); $pdo->exec("UPDATE `students` SET `class_name` = 'CNTT-K18B' WHERE `id` = 5"); $pdo->exec("UPDATE `students` SET `class_name` = 'KTPM-K19A' WHERE `id` = 6"); $pdo->exec("UPDATE `students` SET `class_name` = 'ANM-K18A' WHERE `id` = 7"); if (isset($_POST['run_migrate_seed'])) { $alterMsg = 'Đã chạy lại Migration & StudentSeeder cập nhật cột `class_name` cho toàn bộ sinh viên!'; } } $columns = $pdo->query("SHOW COLUMNS FROM `students`")->fetchAll(); $students = $pdo->query("SELECT * FROM `students` ORDER BY `id` ASC")->fetchAll(); } catch (Throwable $e) { $dbError = $e->getMessage(); } $migrationCode = is_file(__DIR__ . '/../database/migrations/2026_01_01_000002_add_class_name_to_students_table.php') ? file_get_contents(__DIR__ . '/../database/migrations/2026_01_01_000002_add_class_name_to_students_table.php') : ''; $sqlCode = is_file(__DIR__ . '/add_class_name.sql') ? file_get_contents(__DIR__ . '/add_class_name.sql') : ''; ?> Bài 09 - Migration bổ sung cột class_name & Seed lại dữ liệu | Lab 06
BÀI TẬP 09

Tạo Migration mới bổ sung cột class_name & Seed lại dữ liệu

Sử dụng lệnh php artisan make:migration add_class_name_to_students_table --table=students để thêm cột class_name mà không làm mất dữ liệu hiện có.

Cấu trúc bảng students
Field Type Default
Dữ liệu Sinh viên kèm cột class_name mới
#ID Họ và tên Email Tuổi Giới tính Lớp (class_name)
#
1. Migration 2026_01_01_000002_add_class_name_to_students_table.php
2. SQL tương đương Bai09/add_class_name.sql