我不想在laravel 4上运行“所有未完成的迁移”。我有5个迁移。现在,我只想运行一次迁移。而不是做:php artisan migration我想运行一个特定的迁移,例如:php artisan migration MY_MIGRATION_TO_RUN
我不想在laravel 4上运行“所有未完成的迁移”。我有5个迁移。现在,我只想运行一次迁移。而不是做:php artisan migration我想运行一个特定的迁移,例如:php artisan migration MY_MIGRATION_TO_RUN
php artisan migrate --path="app/database/migrations/my_single_migration"
Answers:
看来您做错了。
迁移是由Laravel按照创建的确切顺序逐一执行的,因此可以跟踪执行和执行顺序。这样,Laravel将能够安全地回滚一批迁移,而不必担心破坏数据库。
赋予用户手动执行它们的能力,使得无法(肯定)知道如何回滚数据库中的更改。
如果您确实需要执行数据库中的某些操作,则最好创建一个DDL脚本并在Web服务器上手动执行它。
或者只是创建一个新的迁移并使用artisan执行它。
编辑:
如果需要先运行它,则需要先创建它。
如果只需要对它们重新排序,则将文件重命名为第一个。迁移是使用timestemp创建的:
2013_01_20_221554_table
要在此迁移之前创建一个新迁移,可以为其命名
2013_01_19_221554_myFirstMigration
只需将已经运行的迁移移出app / config / database / migrations /文件夹。然后运行命令php artisan migrate
。对我来说像是一种魅力。
一个不错的小片段,可减轻运行Laravel 4迁移时的任何恐惧php artisan migrate --pretend
。如果您运行实际的迁移,这只会输出将要运行的SQL。
听起来您的初始4迁移已经运行。我猜想当您php artisan migrate
将仅运行新的最新迁移时。
忠告:确保您的所有up()和down()都能按预期运行。我在运行迁移时喜欢运行up(),down(),up(),只是为了对其进行测试。您要进行5-6次迁移,并意识到您无法毫不费力地回滚它们,将是很糟糕的,因为您没有将down()与up()100%匹配。
只是我的两分钱!希望能有所--pretend
帮助。
--pretend
有一个缺点。在up
和down
方法中,如果查询数据库,它将不返回任何记录。
重新运行迁移的唯一方法是肮脏的迁移。您需要打开数据库并删除迁移表中代表您的迁移的行。
然后再次运行php artisan migration。
This table does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.
我知道有一种简单的方法只能在本地主机上使用
php artisan migrate
从命令行或终端运行命令。这只会迁移数据库中迁移表中不存在的表。这种方法是完全安全的,不会出现任何错误或问题,尽管看起来像非专业方法,但仍然可以正常工作。
祝好运
我有同样的问题。将表创建代码复制到第一个迁移文件中,如下所示:
public function up()
{
Schema::create('posts', function(Blueprint $table){
$table->increments('id');
// Other columns...
$table->timestamps();
});
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
// Other columns...
$table->softDeletes()->nullable();
});
}
您也可以batch
在migrations
表中更改(减少)列号;)
然后运行php artisan migrate
。
如果您不想应用迁移,则在迁移中引发异常,这将停止整个迁移过程。
使用这种方法,您可以将一堆迁移分为多个步骤。
您可以使用以下解决方案:
php artisan migrate:status
。php artisan migrate:rollback --path:2018_07_13_070910_table_tests
。php artisan migrate
。最后,您迁移特定表。祝好运。
我在第1行使用return,因此先前的数据库保持原样。
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
return; // This Line
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 50);
$table->string('slug', 50)->unique();
$table->integer('role_id')->default(1);
$table->string('email', 50)->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('mobile', 10)->unique();
$table->timestamp('mobile_verified_at')->nullable();
$table->text('password');
$table->integer('can_login')->default(1);
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
return;// This Line
Schema::dropIfExists('users');
}
}
对于仍然对此感兴趣的任何人,Laravel 5更新: Laravel实现了一次运行一个迁移文件的选项(在5.7版中)。
现在,您可以运行这个命令:
php artisan migrate --path=/database/migrations/my_migration.php
(如回答在这里)
因为Illuminate\Database\Migrations\Migrator::getMigrationFiles()
现在包含此代码:
return Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path.'/*_*.php');
(见的源代码。)
但是在我的用例中,我实际上想同时运行一组迁移,而不仅仅是一个或全部。
因此,我采用了Laravel的方式,并注册了Migrator的其他实现,该实现决定了要使用的文件:
/**
* A migrator that can run multiple specifically chosen migrations.
*/
class MigrationsSetEnabledMigrator extends Migrator
{
/**
* @param Migrator $migrator
*/
public function __construct(Migrator $migrator)
{
parent::__construct($migrator->repository, $migrator->resolver, $migrator->files);
// Compatibility with versions >= 5.8
if (isset($migrator->events)) {
$this->events = $migrator->events;
}
}
/**
* Get all of the migration files in a given path.
*
* @param string|array $paths
* @return array
*/
public function getMigrationFiles($paths)
{
return Collection::make($paths)->flatMap(function ($path) {
return Str::endsWith($path, ']') ? $this->parseArrayOfPaths($path) :
(Str::endsWith($path, '.php') ? [$path] : $this->files->glob($path . '/*_*.php'));
})->filter()->sortBy(function ($file) {
return $this->getMigrationName($file);
})->values()->keyBy(function ($file) {
return $this->getMigrationName($file);
})->all();
}
public function parseArrayOfPaths($path)
{
$prefix = explode('[', $path)[0];
$filePaths = explode('[', $path)[1];
$filePaths = rtrim($filePaths, ']');
return Collection::make(explode(',', $filePaths))->map(function ($filePath) use ($prefix) {
return $prefix . $filePath;
})->all();
}
}
我们必须将其注册为容器'migrator'
(才能通过进行访问$app['migrator']
),因为这是当Migrate命令将其自身注册到IoC时对其进行访问的方式。为此,我们将以下代码放入服务提供商中(在我的情况下为DatabaseServiceProvider
):
public function register()
{
$this->app->extend('migrator', function ($migrator, $app) {
return new MultipleSpecificMigrationsEnabledMigrator($migrator);
});
// We reset the command.migrate bind, which uses the migrator - to
// force refresh of the migrator instance.
$this->app->instance('command.migrate', null);
}
然后,您可以运行以下命令:
php artisan migrate --path=[database/migrations/my_migration.php,database/migrations/another_migration.php]
请注意多个迁移文件,以逗号分隔。
它已经在Laravel 5.4中进行了测试并且可以正常工作,并且应该与Laravel 5.8兼容。
为什么?
对于任何感兴趣的人:用例都在更新数据库的版本及其data。
例如,假设您想将所有用户的街道和门牌号合并到新列中,我们称之为 street_and_house
。想象一下您想以一种安全且经过测试的方式在多个安装上执行此操作-您可能会为此创建一个脚本(在我的情况下,我创建了数据版本控制命令-artisan命令)。
要执行此操作,首先必须将用户加载到内存中。然后运行迁移以删除旧列并添加新列;然后为每个用户分配 street_and_house=$street . " " . $house_no
和保存用户。(我在这里简化,但是您当然可以想象其他情况)
而且我不想依靠我可以在任何给定时间运行所有迁移这一事实。想象一下,您想将其从1.0.0升级到1.2.0,并且有许多批次的此类更新–执行更多迁移可能会破坏您的数据,因为这些迁移必须由他们自己的专用update命令处理。因此,我只想运行此更新知道如何使用的选定的已知迁移,然后对数据执行操作,然后可能运行下一个update data命令。(我想尽可能地防御)。
为此,我需要上述机制并定义一组固定的迁移要运行,以使此命令起作用。
注意:我本来希望使用一个简单的装饰器来利用magic__call
方法,并避免继承(Laravel在\Illuminate\Database\Eloquent\Builder
包装时使用的类似机制 \Illuminate\Database\Query\Builder
),但是MigrateCommand
可悲的是Migrator
,它需要在其构造函数中有一个实例。
最后说明:我想将这个问题的答案发布到我该如何在laravel中运行特定的迁移,因为它是Laravel 5特有的。但是我不能-因为该问题被标记为该问题的重复(尽管该问题被标记为Laravel 4)。
您可以键入以下命令:
PHP Artisan Migration-帮助
...
--path [= PATH]要执行的迁移文件的路径(允许多个值)
...
如果确实显示了一个名为“ --path”的选项(如上例),则表示您的Laravel版本支持此参数。如果是这样,那么您可以靠运气输入以下内容:
php artisan migration --path = /数据库/migrations/v1.0.0/
其中“ v.1.0.0”是位于“ / database / migrations”目录下的目录,其中包含要针对特定版本运行的那些迁移。
如果没有,那么您可以在迁移表中签入,查看已经运行了哪些迁移,如下所示:
选择*从迁移;
然后将已执行的文件夹移出“ / database / migrations”文件夹。通过创建另一个文件夹“ / databases / exected-migrations”并将已移至。
之后,您应该能够执行:
PHP的工匠迁移
无需任何危险即可覆盖架构/数据库中的任何现有表。