我可能误解了它是如何工作的,但是实现这一目标的最佳方法是什么?我有一些想法,但它似乎很hacky.
我有一组样本数据用于测试我的应用程序.这是通过Laravel的内置播种机播种的.这包含示例用户,地址,文档等内容.
我还有一组应该投入生产的默认数据.我目前直接在迁移中添加它.例如,如果我要为account_roles添加表,我可能会在迁移的底部包含以下内容
$account_admin = array('role' => 'Account Administrator', 'flag' => 'ACCOUNT_ADMIN');
$account_owner = array('role' => 'Account Administrator', 'flag' => 'ACCOUNT_OWNER');
DB::table('account_roles')->insert($account_admin);
DB::table('account_roles')->insert($account_owner);
Run Code Online (Sandbox Code Playgroud)
这样,在生产时,我只是迁移数据库以插入任何生产就绪数据库值,并且在暂存/开发时,我可以刷新迁移,然后使用样本数据为数据库设定种子.
有没有其他(更好)的方法来做到这一点?
我需要通过迁移和播种数据库来更新现有的 Laravel 应用程序。
我有一张如下表:
项目
我想编辑数据库看起来像:
项目
类型(新表)
随着TYPE_ID是一个非空的外键类型的表。
该类型的表将在接下来的操作中Laravel播种机播种。每次应用程序更新后都会调用此播种器,并截断/重新插入一些仅随应用程序更新而更改的“静态”数据。它的配置方式类似于Laravel : Migrations & Seeding for production data for the for the local/production差异
在本地数据库上从头开始时一切正常。但是在生产数据库上,已经有很多记录了。由于它是一个非空键,因此在推送到此数据库(实际上是该数据库的副本以供测试)时迁移失败
作为迁移解决方案,我想将第一个类型记录添加到每个现有项目,但我无法在迁移过程中设置外键,因为项目表在此阶段为空,并且在播种之前我不能将其留空,因为迁移没有通过。
我觉得有几点:
我该怎么办 ?
编辑:这是我使用@lukasgeiter 回答的工作迁移代码:
public function up()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::table('items', function(Blueprint $table)
{
$table->integer('type_id')->unsigned()->index()->after('name');
});
DB::update('update items set type_id = 1'); …Run Code Online (Sandbox Code Playgroud) 在 Laravel 中使用 --force 在生产中使用播种机进行迁移时,数据库陷入困境。我对运行 Amazone linux 的 Laravel Homestead 和 EC2 AWS 的效果相同。laravel.log 中没有消息。
它只是永远不会结束。如果我用 停止它<ctrl>+<c>,我会看到创建的表但没有运行播种机,表是空的。
详情:
我的迁移:
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 50);
$table->decimal('price', 8, 2); //up to 999,999.99
});
Artisan::call('db:seed', ['--class' => 'ProductsSeeder']);
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
$ php artisan migrate --force
Run Code Online (Sandbox Code Playgroud)
我的 .env
#APP_ENV=local
APP_DEBUG=false
Run Code Online (Sandbox Code Playgroud)
数据库种子。
class ProductsSeeder extends Seeder
{
public function run()
{
DB::table('products')->insert([
'id' => 1,
'name' => 'super product',
'price' => 999.99,
]);
}
Run Code Online (Sandbox Code Playgroud)
已测试 Laravel …