Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Larvel每次迁移都有多个表_Php_Sql_Laravel - Fatal编程技术网

Php Larvel每次迁移都有多个表

Php Larvel每次迁移都有多个表,php,sql,laravel,Php,Sql,Laravel,我是Laravel的新手,所以对这个框架的最佳实践有点陌生。我试图了解使用创建数据库的最佳方法 我在web上找到的几个示例,包括Laravel文档和,似乎是指只处理一个表的迁移脚本。我正在创建一个包含大约10个表的应用程序,所有表之间都与外键相关,有些表具有多对多关系 建议的方法是每个表有一个迁移文件吗?如果是,为什么?(如果有的话,将所有表创建脚本放在一个文件中有什么缺点?) 外键和关系呢?如何强制执行这些关系,以及迁移的执行顺序,以便在table1引用table2中的列时,在table1之前

我是Laravel的新手,所以对这个框架的最佳实践有点陌生。我试图了解使用创建数据库的最佳方法

我在web上找到的几个示例,包括Laravel文档和,似乎是指只处理一个表的迁移脚本。我正在创建一个包含大约10个表的应用程序,所有表之间都与外键相关,有些表具有多对多关系

  • 建议的方法是每个表有一个迁移文件吗?如果是,为什么?(如果有的话,将所有表创建脚本放在一个文件中有什么缺点?)

  • 外键和关系呢?如何强制执行这些关系,以及迁移的执行顺序,以便在table1引用table2中的列时,在table1之前创建table2

  • 多对多关系呢?关系(透视)表是否也需要通过单独的迁移脚本手动创建?如果是,是什么确保在2个相关表之后创建


  • 在开发应用程序的过程中,我认为您不应该太在意每次迁移只有一个表,有时候在一次迁移中将一些表放在一起比较容易,但是一旦您的系统投入生产,您将无法继续这样工作,因为您将只在生产环境中进行迁移,而且可能永远不会回滚,所以您的迁移将非常小,有时您需要为单个列创建进行迁移

    将表放入不同迁移中的好处与使用精简类的好处相同,一个文件中的信息越少,管理和更改就越容易。所以,如果您将所有表放在一次迁移中,那么维护起来就比较困难,但这实际上取决于您自己

    外键是一个很好的例子,说明了为什么您应该为每个表甚至每个外键创建一个迁移:每次回滚与外键相关的表时,您必须首先删除所有外部依赖项,这就是为什么Laravel创建一个迁移表并以相同的顺序迁移它们,这有助于您永远不会丢失表。因此,首先创建表迁移,然后创建外键迁移,因此当回滚时,它将首先回滚约束,然后回滚表

    我在表的相同迁移中为表创建外键,除非我有太多的交叉外键。但是我总是在一个单独的
    Schema::table()
    命令中创建一个外键,因为有些数据库需要在将约束附加到列之前先拥有该列:

    public function up()
    {
        Schema::create('statuses', function(Blueprint $table)
        {
            $table->string('id', 64)->primary();
    
            $table->string('user_id', 64)->index();
            $table->text('body');
    
            $table->timestamps();
        });
    
        Schema::table('statuses', function(Blueprint $table)
        {
            $table->foreign('user_id')
                    ->references('id')
                    ->on('users')
                    ->onUpdate('cascade')
                    ->onDelete('cascade');
        });
    }
    
    关于多对多,如果同时创建表和外键,则应首先创建主表,然后创建透视表,但如果要在单独的迁移中创建外键,则应首先创建表(顺序无关紧要,但在这些情况下最好进行组织)然后是外键的迁移

    在开发过程中,我在表中做了很多更改,所以我总是回到表中,所以当我更改迁移时,我通常会这样做:

    1)
    php artisan迁移:重置
    多次

    2) 改变迁移

    3)
    php artisan迁移

    如果我只是创建一个新的,通常不会有任何问题,因为迁移通常是理想的

    您的上一个问题已经得到了回答,但我要再说一遍:Laravel使用时间戳命名迁移文件,这样您就永远不会在迁移之前先运行迁移,然后再创建另一个迁移:

    2014_07_16_190821_create_statuses_table
    
    以及迁移的名称,因为上面的这一个将创建这个类:

    CreateStatusesTable
    

    因此,您必须做的一件事是使用不同的名称创建每个迁移,否则您将得到两个同名的类,而不是Laravel,但PHP会对此表示不满。

    非常感谢您的解释。这很有帮助。是的,我完全理解应用程序投入生产后需要进行小的增量更改。我不确定最初创建大量表是为了让我继续工作。然而,考虑到时间戳实际上强制迁移执行的顺序(我忽略了这一点),我想我不必担心由于不存在表而无法创建关系。再次感谢!最后给出了一些有用的拉威尔信息。他们的教程和文档非常棒,但通常包含基本用例,而不是严肃编程所需的内容。回答很好我认为是这样的,但我很高兴你已经证实了这一点,这是有道理的,但我可以理解为什么OP会问这个问题,因为我也在想同样的问题。