编程

在 Laravel 中使用迁移进行数据库 Schema 管理:深度教程

135 2024-12-21 09:01:00

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)中
  • 拆分迁移:将大的迁移拆分成小迁移,可以使得回滚及调试更为简单。
  • 避免修改现有迁移:如果你已经在生产中运行过迁移,请创建新迁移来修改数据库,而不是修改已有的迁移。