如何创建一个可以调用所有迁移类的主迁移类?

Posted

技术标签:

【中文标题】如何创建一个可以调用所有迁移类的主迁移类?【英文标题】:How to create a master migration class that would call all your migration classes? 【发布时间】:2019-07-02 06:32:07 【问题描述】:

在 Laravel 中,创建迁移和播种器的顺序至关重要。

当这些在 artisan 中运行时,如果一个类(表)中有任何外键,并且一个在被引用的那个之前执行,那么执行将停止,并且你会得到一个错误。

当您调用 php artisan db:seed 时,会运行一个名为 DatabaseSeeder 的类。本课程包括您所有的播种机课程。 https://laravel.com/docs/5.7/seeding#writing-seeders

迁移有什么等价物吗?

<?php

class DatabaseSeeder extends Seeder

    public function run()
    
        $this->call([
            LanguageTableDataSeeder::class,
            UserTableDataSeeder::class,
            PlaceTableDataSeeder::class]);
    

【问题讨论】:

【参考方案1】:

是的,你可以做到的

但不推荐

第 1 步: 运行命令 php artisan make:migration create_bulk_table

现在打开database/migrations 中的迁移文件夹,您将找到新的迁移time_stamp_create_bulk_table.php

打开它你会发现这样的内容

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBulkTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('bulk', function (Blueprint $table) 
            $table->increments('id');
            $table->timestamps();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('bulk');
    

怎么做

这里面有两种方法

一个用于creating the table,即up METHOD

另一个是dropping the table,即down METHOD

例如如果你想迁移

posts 表,tasks 表,products

在单一迁移中

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBulkTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    

        if (!Schema::hasTable('posts')) 
        

            Schema::create('posts', function (Blueprint $table) 
                $table->increments('id');
                $table->string('post_name');
                $table->text('post_desc');
                $table->timestamps();
            );
        


        if (!Schema::hasTable('tasks')) 
        

            Schema::create('tasks', function (Blueprint $table) 
                $table->increments('id');
                $table->string('task_name');
                $table->enum('task_status', ['Open', 'Closed','Inactive']);
                $table->text('task_desc');
                $table->timestamps();
            );
        


        if (!Schema::hasTable('products')) 
        

            Schema::create('products', function (Blueprint $table) 
                $table->increments('id');
                $table->string('product_name');
                $table->text('product_desc');
                $table->string('product_price');
                $table->timestamps();
            );


        


    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('posts');
        Schema::dropIfExists('tasks');
        Schema::dropIfExists('products');

    

BE CAREFUL WHILE REFERING THE FORIEGN KEY OF PARENT TABLE WHICK NEEDS TO BE CREATED BEFORE THE REFERAL

例如,您在 post 表中有列 user_id,您所指的就像

 $table->foreign('user_id')->references('id')->on('users');

users表需要在posts表之前迁移

希望清楚

如果您发现任何错误,请在下方评论

【讨论】:

谢谢 Manojkiran A.!这样做是有道理的。有趣的是,没有特定的工匠命令可以使它像 `` DatabaseSeeder ``。太方便了!

以上是关于如何创建一个可以调用所有迁移类的主迁移类?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写迁移以使用 ManyToManyField 更改模型的主键

outlook2007如何从一个用户迁移到另一个用户

flask-migrate数据库迁移

Android-Room 可以自动创建迁移吗?

EF CodeFirst 数据库创建与迁移

如何从 Laravel 项目中删除所有迁移但保留表和字段