在 Laravel 中使用迁移进行数据库 Schema 管理:深度教程
Laravel 迁移是管理数据库 Schema 修改的好方法。它们允许你对数据库结构进行版本控制,并随着时间的推移轻松回滚或修改更改。在本指南中,我们将逐步探索在 Laravel 中创建、运行和回滚迁移的过程,并配以一个实践示例。
步骤 1: 设置 Laravel 环境
在开始迁移之前,请确保已安装 Laravel。你可以通过 Composer 完成此操作:
composer create-project --prefer-dist laravel/laravel migration-demo
然后来到项目目录:
cd migration-demo
步骤 2: 数据库配置
要配置数据库,请打开 .env
文件并更新数据库配置信息:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database_name
DB_USERNAME=your_username
DB_PASSWORD=your_password
配置好数据库后,如果本地环境中还没有该数据库,请创建一个。
步骤 3: 创建迁移
使用 artisan
命令创建新的迁移。比如,要创建 users
表迁移:
php artisan make:migration create_users_table
该命令在 database/migrations
目录中生成迁移文件。其文件名将包含一个时间戳,如: 2024_09_13_123456_create_users_table.php
。
步骤 4: 定义迁移 Schema
打开生成的迁移文件。你将看到两个方法:up()
(定义表格的创建过程) 和 down()
(用来定义表格如何回滚)。
下例用于创建 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->id(); // Primary key
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps(); // Created at & Updated at
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
在 up()
方法中,我们定义了 users
表的结构。down()
方法定义了回滚时如何删除表格。
步骤 5: 运行迁移
要执行迁移并在数据库中创建 users
,请使用如下命令:T
php artisan migrate
该命令将执行所有还未执行过的迁移。你将看到如下输出:
Migrating: 2024_09_13_123456_create_users_table
Migrated: 2024_09_13_123456_create_users_table (0.45 seconds)
你可以到数据库中验证 users
表是否已被创建。
步骤 6: 迁移回滚
要回滚到上一次迁移,请使用如下命令:
php artisan migrate:rollback
该命令将移除 users
表或者所有其他上次迁移时定义的表。
要回滚多次迁移,请使用:
php artisan migrate:rollback --step=2
这个命令将回滚最近两次迁移。
步骤 7: 修改现有的表
如果要修改现有的表格(比如,添加字段),请创建新的迁移:
php artisan make:migration add_phone_to_users_table --table=users
这将创建一个修改 users
表格的迁移。然后你就可以定义修改的内容:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('phone')->nullable(); // Add phone column
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('phone'); // Remove phone column
});
}
执行迁移,实现修改:
php artisan migrate
步骤 8: 创建数据库种子数据
Laravel 也允许你使用虚拟数据作为种子。要创建 seeder,请使用:
php artisan make:seeder UsersTableSeeder
种子文件位于 database/seeders/UsersTableSeeder.php
,你可以定义种子数据:
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class UsersTableSeeder extends Seeder
{
public function run()
{
DB::table('users')->insert([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => Hash::make('password'),
]);
}
}
执行种子数据的创建,请使用:
php artisan db:seed --class=UsersTableSeeder
你也可以在 DatabaseSeeder.php
中调用该 seeder,创建种子数据:
步骤 9: 运行所有迁移并生成种子数据
要重置数据库,并运行所有迁移及种子:
php artisan migrate:fresh --seed
该命令将删除所有表格,重新运行所有迁移并创建种子数据。
步骤 10: 迁移最佳实际
- 版本控制:始终将迁移跟代码一起提交(Commit)到版本控制(Git)中
- 拆分迁移:将大的迁移拆分成小迁移,可以使得回滚及调试更为简单。
- 避免修改现有迁移:如果你已经在生产中运行过迁移,请创建新迁移来修改数据库,而不是修改已有的迁移。