在 Laravel 中,迁移(Migrations) 和 填充(Seeding) 是管理数据库的两个重要概念。它们为数据库操作提供了结构化、版本化以及灵活的解决方案,使得数据库的管理更加高效和便捷。下面将详细介绍这两者的核心概念及应用,帮助你快速理解并掌握它们。
迁移是 Laravel 提供的数据库结构版本控制系统。它允许你通过 PHP 代码来创建和修改数据库结构,而不需要直接编写 SQL 语句。迁移帮助你在团队中保持数据库结构的一致性,并支持数据库版本的管理。
up()
方法:迁移文件中的 up()
方法定义了数据库表的创建和修改。down()
方法:down()
方法用于回滚迁移操作。通常它会删除表或撤销 up()
方法中所做的更改。迁移文件通常与模型一同创建。你可以使用 Artisan 命令来生成迁移文件。
php artisan make:migration create_products_table
这条命令会在 database/migrations/
目录中生成一个以时间戳命名的迁移文件,如:
id(); // 自动创建 id 字段作为主键
$table->string('name');
$table->decimal('price', 8, 2);
$table->timestamps(); // 创建 created_at 和 updated_at 时间戳字段
});
}
public function down()
{
// 删除 products 表
Schema::dropIfExists('products');
}
}
up()
方法:在 up()
方法中,我们定义了要创建的数据库表及其字段。down()
方法:在 down()
方法中,我们定义了回滚时应删除的表或字段。迁移文件创建后,可以使用以下命令来执行迁移操作,应用数据库结构变更:
php artisan migrate
这个命令会查找所有未执行的迁移,并在数据库中创建/修改表结构。
如果需要撤销上一次的迁移操作,可以使用:
php artisan migrate:rollback
这会调用 down()
方法,撤销上次迁移的操作。
如果你想回滚所有迁移并重新执行它们,可以使用:
php artisan migrate:reset
通过以下命令,你可以回滚所有迁移,然后重新运行它们。这对在开发过程中重新设计数据库结构非常有用:
php artisan migrate:refresh
Laravel 提供了许多常用的 Schema 构建方法来定义数据库表。
$table->string('name'); // 字符串类型,默认长度255
$table->integer('age'); // 整型
$table->float('price', 8, 2); // 浮动数字类型,8位数字,2位小数
$table->decimal('salary', 10, 2); // 精确数字类型
$table->boolean('is_active'); // 布尔类型
$table->date('birthdate'); // 日期类型
$table->datetime('created_at'); // 日期时间类型
$table->text('description'); // 长文本类型
$table->string('email')->unique(); // 唯一索引
$table->foreignId('category_id')->constrained(); // 外键
$table->timestamps(); // 自动创建 created_at 和 updated_at 时间戳
// 添加字段
Schema::table('products', function (Blueprint $table) {
$table->string('sku')->nullable(); // 添加 sku 字段
});
// 删除字段
Schema::table('products', function (Blueprint $table) {
$table->dropColumn('sku'); // 删除 sku 字段
});
填充是向数据库表中插入测试数据的过程。Laravel 提供了一个强大的填充系统,使得我们可以生成大量的假数据进行开发和测试。
Laravel 使用 php artisan make:seeder
命令来创建填充器文件。一个填充器文件会包含你要插入数据库的数据。
php artisan make:seeder ProductSeeder
这会在 database/seeders
目录下生成一个 ProductSeeder.php
文件。
填充器文件的内容如下:
create();
// 手动填充数据
Product::create([
'name' => 'Product A',
'price' => 99.99,
'description' => 'This is a description for Product A',
]);
}
}
你可以在 run()
方法中使用模型工厂或手动插入数据。
工厂是 Laravel 提供的用于快速生成测试数据的功能。你可以为每个模型创建一个工厂,并通过工厂生成大量假数据。
php artisan make:factory ProductFactory --model=Product
database/factories/ProductFactory.php
中定义数据生成规则: $this->faker->word(),
'price' => $this->faker->randomFloat(2, 10, 500),
'description' => $this->faker->sentence(),
];
}
}
填充器定义好之后,可以使用以下命令来执行填充操作,将数据插入数据库:
php artisan db:seed --class=ProductSeeder
如果你希望执行所有的填充器,可以直接运行:
php artisan db:seed
你还可以在迁移刷新时同时刷新填充数据:
php artisan migrate:refresh --seed
这会先回滚并重新运行所有迁移,然后执行所有的填充操作。
通过使用迁移和填充,开发者可以:
php artisan make:migration
创建迁移文件。up()
和 down()
方法,分别用于应用和回滚数据库更改。php artisan migrate
执行迁移。php artisan make:seeder
创建填充器文件。php artisan db:seed
执行填充。