通常您不会将数据从一个环境传输到另一个环境。如果您需要使用数据填充数据库,但是您可以使用几种方法,您似乎已经有一些使用经验。
播种机
请注意,播种器不像迁移那样工作,播种器将在您每次发出 php artisan db:seed 命令时运行,这可能不是您在部署过程中想要的,因为它通常会导致在重复数据中。它的主要用途是在开发过程中重新填充数据库。既然是这种情况,我建议改用迁移。
我见过很多应用程序使用带有条件语句的播种器来决定是否根据当前环境播种数据:
class MyTableSeeder extends Seeder
{
if (in_array(config('env'), ['production', 'staging'])) {
// Seed data for production or staging
} elseif (config('env') == 'dev') {
// Seed data only for dev environment
}
// Seed data for ALL environments (Production, staging, dev) etc. You get the picture
}
我已经看到一些创建自己的配置项和辅助函数来确定是否应该迁移数据,而不是简单地依赖 env 配置项,所以你会在播种器中看到类似的东西而不是if 语句检查env 配置项的值:
if (should_seed_data()) {
// Seed data here
}
这为能够标记是否播种某些数据增加了一点灵活性,而不管应用程序当前设置为什么env。
迁移(推荐)
如果您需要在部署过程中用数据填充数据库,例如在您的情况下,您可能正在部署一个需要用区域数据填充数据表才能工作的功能,我建议您这样做作为迁移过程的一部分:
class YourMigration extends Migration
{
protected $regions = ['East Bay', 'South Bay'];
public function up()
{
// Seed your region data here
foreach ($this->regions as $name) {
Region::create(['name' => $name]);
}
}
}
使用迁移而不是播种机的最大优势是迁移仅打算运行一次。迁移后,Laravel 会跟踪已经运行的迁移,并且不会重复它们,因此您不必担心数据会多次在那里结束。另一方面,每次运行 php artisan db:seed 时都会运行播种器,通常不会设置为在部署期间运行。
最终,我认为没有错误的方法可以做到,也没有公认的标准方法,所以这完全取决于你