从迁移中选择性地迁移Laravel特定文件

154

你好,请阅读此处的所有文档:https://laravel.com/docs/5.4/migrations

是否有一种方法可以迁移一个特定的迁移文件(仅限1个迁移),因为现在每当有更改时,我都使用php artisan migrate:refresh,导致所有字段都被重置。


1
提示:请不要再添加只是php artisan migrate:refresh --path=/database/migrations/fileName.php略有变化的答案。 - General Grievance
所问问题的答案在其他地方,但真正的问题在于使用 artisan migrate:refresh,它旨在清除数据库并重新开始。 它不是artisan migrate 一样的正常应用程序维护的一部分。 - miken32
29个回答

211

首先,您应该创建一个 migration 文件来创建您的表,例如:

public function up()
    {
        Schema::create('test', function (Blueprint $table) {
            $table->increments('id');
            $table->string('fname',255);
            $table->string('lname',255);
            $table->rememberToken();
            $table->timestamps();
        });
    }

migrations文件夹中创建test文件夹后,将新创建的migration移动/复制到test文件夹中,然后在您的terminal/cmd中运行以下命令:
php artisan migrate --path=/database/migrations/test/

10
"php artisan migrate --path=database/migrations/test/" 对我有效。 - Joyal
如果这个方法不起作用,你可以在https://dev59.com/UWIk5IYBdhLWcg3wn_f1找到更好的答案。 - Hari Harker
重命名迁移文件对我有用。 - Umar Adil
对我来说,这似乎是运行特定迁移的最佳解决方案。 - Lema
这在Laravel 10上仍然有效,非常感谢AddWEb Solution Pvt LTD和Mel。 - Two

191

您应该将迁移文件的路径添加到刷新此表并运行的操作中。

php artisan migrate:refresh --path=/database/migrations/fileName.php

2
干得好,伙计。什么都不起作用,但你的解决方案起了作用。非常感谢。 - Vipertecpro
正是我在寻找的 :) 谢谢伙计 - VishalParkash
2
有时候它会是database/migrations/fileName.php,没有第一个反斜杠。 - Ahmed Aboud
2
值得一提的是,刷新后您的所有数据都将丢失。如果您希望保留数据,应将其保存在数据库中作为导出文件,在刷新后再进行导入。 - Taranis
1
@Taranis 只刷新表格的数据,不要全部刷新。 - Wissem SASSI
对我来说,这是最好的解决方案,我想运行一个特定的迁移文件。 - muhsin_ap

65

只需查看数据库中的 migrations 表,其中将列出迁移文件名和批次编号。

假设您有以下结构:

id     migration                                           batch

1      2014_10_12_000000_create_users_table                  1 
2      2014_10_12_100000_create_password_resets_table        1
3      2016_09_07_103432_create_tabel_roles                  1
如果您只想回滚 2016_09_07_103432_create_tabel_roles 迁移,将其迁移批处理值更改为最高的 2,然后执行以下操作即可。
php artisan migrate:rollback

只有批次值为2的表将被回滚。现在,对该表进行更改并运行以下控制台命令。

php artisan migrate

migrations表中的批处理值定义了迁移的顺序。当你回滚时,最新的或具有最高批处理值的迁移会首先被回滚,然后是其他迁移。因此,您可以在数据库中更改值,然后回滚特定的迁移文件。

尽管每次更改批处理号码都不是一个好主意,因为表结构之间存在关系,但我们可以在某些情况下使用此方法,其中单个表回滚不会违反表之间的完整性。

希望你理解。


@MartneyAcha 我很高兴你解决了问题,干杯!! - Sagar Gautam
很好的解释。如果你的表中有外键关系,那么这个方法就不适用了。 - Ogbonna Vitalis
@OgbonnaVitalis 谢谢,这将是自主表格的更简单方法。 接受的答案提供了回滚和迁移单个表的确切方式。 对于多个独立的表格,它也有效。 - Sagar Gautam

35

如果你使用制表符来自动完成

php artisan migrate --path='./database/migrations/2019_12_31_115457_create_coworking_personal_memberships_table.php'

25
php artisan migrate --path=database/migrations/2020_04_10_130703_create_test_table.php

注意: 在--path后面不要加/


这太奇怪了,我之前用过这个命令,但出于某种原因,我无法运行特定的文件,但整个基础的 php artisan migrate 运行良好,并且迁移了相同的文件。 - undefined

16

您可以像这样运行命令

php artisan migrate --path=/database/migrations/2020_04_10_130703_create_test_table.php

15

针对特定文件运行此命令:

php artisan migrate:refresh --path="database/migrations/Your_Migration_File_Name_table.php"

这里的 --path= 是指您的文件路径,migrate:refresh 将清空您的表数据

如果您想从数据库中清空所有表的数据,请运行以下命令:

php artisan migrate:refresh

php artisan migrate:refresh --path=database/migrations/2021_10_16_071955_create_aaa_table.php请注意,路径中应使用“/”而不是“\”,且不应包含“”。 - Jahirul Islam Mamun

13

你只能在终端中运行此命令

php artisan migrate --path=database/migrations/2020_10_01_164611_create_asset_info_table.php

迁移后,您应该放置特定的文件名。或者,如果您在迁移中有任何文件夹,则只需在迁移后添加该文件夹名称。

就像这样

php artisan migrate --path=database/migrations/yourfolder/2020_10_01_164611_create_asset_info_table.php

13
你需要将文件放入一个新目录(例如:selected),然后应用。
php artisan migrate  --path=/database/migrations/selected

如果需要回滚:

php artisan migrate:rollback  --path=/database/migrations/selected

注意:

php artisan migrate:refresh

这将回滚并迁移位于默认目录(/database/migrations)中的所有迁移文件。


不需要创建新目录,你可以直接使用文件名,例如 '--path=/database/migrations/fileName.php'。 - Wissem SASSI
从laravel 5.6开始,使用了glob()函数,我认为它只能用于目录,这也使得这个答案在某种程度上是正确的。 - Stanley Aloh

9
php artisan help migrate

您会看到以下选项:

--path[=PATH] 要执行的迁移文件的路径

另外,您可能可以指定要迁移的文件所在的根文件夹:
php artisan migrate --path=/database/migrations/sample.php

或者,您可以在迁移中创建一个新文件夹,然后将您想要的所有迁移文件都迁移到其中:
php artisan migrate --path=/database/migrations/new_folder

你刚刚错过了一个's'。应该是'migrations'! php artisan migrate --path=/database/migrations/new_folder - Pasindu Jayanath
php artisan migrate --path=/database/migrations/new_folder/ 需要最后一个 '/' - Pasindu Jayanath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接