Laravel 迁移是如何工作的?

Posted

技术标签:

【中文标题】Laravel 迁移是如何工作的?【英文标题】:How do Laravel migrations work? 【发布时间】:2015-07-25 01:38:51 【问题描述】:

我对这种类型的框架完全陌生。我来自准系统 php 开发,我似乎无法找到一个易于理解的指南,迁移实际上做了什么。

我正在尝试创建一个已有数据库的项目。我用过这个:https://github.com/Xethron/migrations-generator[1] 但通过迁移对架构进行更改似乎会吐出错误,这意味着我不知道自己在做什么。

我真的需要简单了解迁移的实际作用、它们如何影响数据库以及您认为对绝对初学者有帮助的任何其他内容。

【问题讨论】:

迁移是数据库的一种版本控制。 - 你以前用过版本控制吗?它本质上是一种从一种配置转移到另一种配置,或回到数据库模式的先前版本的一种方式。 如果我在 1.1.1 版本的表中添加新列,那么我的迁移将创建新列(称为“向上” - 移动到下一个版本)并删除该列(称为“向下” - 移至上一个版本) 可能重复? ***.com/q/23010146/472495 【参考方案1】:

迁移是数据库的一种版本控制。它们允许团队修改数据库模式并及时了解当前模式状态。迁移通常与 Schema Builder 配对以轻松管理应用程序的架构。

有了迁移,你不需要在 phpMyAdmin 中创建表,你可以在 Laravel 中完成。下面是一个创建用户表的例子:

class CreateUsersTable extends Migration 

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('users', function(Blueprint $table)
        
            $table->increments('id'); // autoincrement id field
            $table->string('name');   // string field
            $table->string('lastname');
            $table->string('title');
            $table->string('email')->unique();   // unique string field
            $table->string('password', 60);      // string field with max 60 characters
            $table->boolean('Status')->default(0); // string field with default value 0
            $table->timestamps();

        );
    


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


在这段代码中,我们创建了带有“name”、“lastname”等字段的表......我们在 Laravel 代码中说过,迁移完成后它们是字符串类型,我们在数据库中有完整的带有这些字段的表。

运行迁移以创建表

要创建迁移,您可以在 Artisan CLI(artisan 命令行界面)上使用 make:migration 命令:

php artisan make:migration create_users_table

php artisan make:migration create_users_table --create=users

运行迁移以更改表

当您需要对数据库表进行一些更改时,例如:向用户表添加字段投票,您可以在 Laravel 代码中这样做,而无需触及 SQL 代码

php artisan make:migration add_votes_to_users_table --table=users

回滚上次迁移操作

如果您犯了错误并做错了什么,您可以随时回滚以将数据库返回到以前的状态。

php artisan migrate:rollback

回滚所有迁移

php artisan migrate:reset

回滚所有迁移并再次运行它们

php artisan migrate:refresh

php artisan migrate:refresh --seed

迁移的最大优势之一是无需接触 SQL 代码即可创建数据库。您可以在 PHP 代码中创建具有关系的整个数据库,然后将其迁移到 mysql、PL/SQL、MSSQL 或任何其他数据库中。

另外我推荐免费的Laravel 5 fundamental series,在第 7 集中你可以听到更多关于迁移的信息。

【讨论】:

好答案!不过,小问题:我能麻烦你避免在这里说文字吗?我们希望问题尽可能具有可读性,并试图阻止人们将其视为聊天室或论坛。 This is a recent discussion 讨论主题。 如何在现有数据库上使用迁移?这就是主要问题所在。 在现有数据库上github.com/Xethron/migrations-generator 是解决方案之一或 1. 创建一个空数据库 2. 按照需要创建的顺序为每个表创建迁移(考虑到键等) 3 . 为旧数据库添加一个新的数据库连接到您的 database.php 文件(如果在不同的服务器上) 4. 创建种子文件以将信息从旧数据库提取到新数据库。 这个答案似乎刚刚从文档中复制而来,恕我直言,这不是很好。除了在数据库/迁移中创建文件之外,make:migration 实际上还做了什么?为什么,当数据库/迁移中有文件时,命令 migrate:status 是否响应“未找到迁移?”在什么时候创建迁移?如何运行它们以应用它们包含的更改?有什么方法可以为我的数据库中的所有表创建起点迁移吗? laravel 文档和帮助命令也没有解释这一点:laravel.com/docs/5.4/migrations 向迁移的表插入数据时,表未自动创建。它显示SQLSTATE[42S02]: Base table or view not found: 1146 Table 'expenses.users' doesn't exist【参考方案2】:

假设您正在与其他开发人员一起开发一个项目。随着开发者添加越来越多的功能,他们也需要添加越来越多的表、列、删除列、更改列数据类型等......

这很容易失控。如果您错过了某个开发人员的某些 SQL,则另一个开发人员的 SQL 可能无法正常工作。尝试对一堆 sql 文件进行排序以找出您错过了哪些文件也可能会浪费大量时间。开发团队中的每个人都在使用不同的数据库只是时间问题,否则上帝保佑,有人破坏了生产数据库。使用迁移,您只需在命令行中运行php artisan migrate,所有对数据库的更改都会为您处理。

这基本上就是迁移有用的原因我不打算深入介绍它们的基本工作原理,因为 Kryten 已经在这里写了一篇很好的文章。

【讨论】:

【参考方案3】:

迁移的简单解释:

它们是您的数据库方案的版本控制系统。

假设您正在设置一个新应用程序。您要做的第一件事是创建一个包含几列的表(称为mytable)。这将是您的第一次迁移。当您开始处理您的应用程序时运行迁移 (php artisan migrate),!您的数据库中有一个新表。

一段时间后,您决定需要在表中添加一个新列。您创建了一个迁移(Laravel 5 中的php artisan make:migration)并为您创建了一个新的迁移文件。您更新了该迁移中的代码,再次运行 php artisan migrate,您的表中有一个新列。

好的,这就是迁移背后的基本理念。但还有更多……

假设稍后,您意识到在创建最后一次迁移时您搞砸了。你已经运行了它,所以你的数据库已经改变了。你怎么修?好吧,如果您正确编写了迁移并实现了down 方法,您可以执行php artisan migrate:rollback,它会回滚迁移。

Laravel 是如何做到这一点的?通过在特殊的数据库表中跟踪您的迁移。 php artisan migrate:install 命令将为您设置好东西,以便 Laravel 可以管理这些迁移。

随着时间的推移,随着应用程序的增长,您将添加越来越多的迁移。 Laravel 为您提供了一种根据需要在迁移中前进和后退的方法,以确保您的数据库在您工作时处于您需要的任何状态。

使用php artisan 查看artisan 命令列表。您还可以使用 php artisan help <command> 请求有关特定命令的帮助。

【讨论】:

以上是关于Laravel 迁移是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 laravel 迁移和种子正确处理数据库数据更改

laravel 5.4 迁移无法正常工作

将迁移放在 Laravel 5.1 包中的啥位置?

获取 laravel 4 迁移执行的原始 SQL

无法添加外键约束 - Laravel 迁移错误

在 Laravel 4 中通过迁移脚本创建 MySQL 视图