shell Laravel artisan Migrate:如果在系统上下文中使用,则无法使用Fresh

9rygscc1  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(93)

我试图创建一个命令,在不同的文件夹中运行migrate:fresh命令,以便在当前文件夹中运行migrate:fresh的同时重置模拟应用程序。它是这样设置的:

$command = sprintf('(cd %s && php artisan migrate:fresh)', $path); 
system($command);

字符串
这里的路径是绝对路径。运行此命令将给出输出:

Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (16.60ms)


然而,当在应用程序的数据库中进行验证时,所有数据仍然存在,并且没有任何新设置。因此,看起来数据没有被正确迁移,尽管Laravel声称它是。
起初我以为是因为电话使用系统。所以我使用了exec,shell_exec和Symfony进程。此外,因为我认为这可能是一个权限问题,所以我尝试使用sudo运行该命令。这并没有帮助。Laravel版本8.8

$command = sprintf('(cd %s && php artisan migrate:fresh)', $path); 
exec($command);
shell_exec($command);

$process = Process::fromShellCommandline($command);
$process->run();


每一个似乎都在“工作”,输出与上面类似。然而,当验证数据是否消失时,它仍然存在。我的期望是,在创建了一个子shell并看到输出之后,该过程实际上已经正确运行了。但事实似乎并非如此。

bvjveswy

bvjveswy1#

Matiaslauriti有这个权利。它实际上运行在错误的环境中,因此它实际上覆盖了主数据库。之所以“看起来”没问题,是因为在mock数据库迁移之后,在该数据库上运行了migrate:fresh。
最后,最终解决我的问题的是以一种困难的方式设置环境,创建一个这样的结构(请注意,我使用Dotenv为我的环境变量创建Map并加载文件):

try {
    putenv('DB_DATABASE=' . $mockEnv['DB_DATABASE']);
    system(sprintf('cd %s && php artisan migrate:fresh', $path));
} finally { 
    putenv('DB_DATABASE=' . $actualEnv['DB_DATABASE']);
}

字符串
我尝试迁移,如果由于 * 任何原因 * 失败,环境仍将被放回。该命令本身会将应用程序上下移动,因此我并不担心这方面的检查。

相关问题