php - Seeder 第一次运行良好,但在 Laravel 5 的后续循环中不执行某些任务?

标签 php loops laravel laravel-5

我正在开发一个 Multi-Tenancy 多数据库应用程序,其中我有一个主DB,它由一个租户表组成,然后对于创建的每个租户,都有一个新的DB已创建。我正在为此编写一个种子文件,并运行它 3 次来为它们创建 3 个租户和后续的 3 个DB

第一次运行良好。在主数据库中创建了一个新租户。使用新租户的用户名创建新的DBDB 也通过代码中的 Artisan 命令调用进行迁移。但在接下来的 2 个循环中,租户在主数据库中创建,并且还为它们创建了新的数据库,但使用了 Artisan 命令调用不会迁移DB

public function run()
{
    $faker = Faker::create();

    // Fetching all tenants
    $tenants = App\Tenant::all();

    // Deleting their databases
    $tenants->each(function($tenant){
        DB::statement('DROP DATABASE IF EXISTS ' . $tenant->username);
    });

    // Truncating the tenants table itself
    DB::table('tenant')->truncate();

    for($i = 0; $i < 3; $i++){

        $company = $faker->company();
        $description = $faker->text();
        $logo = $faker->imageUrl(50, 50);
        $username = str_random(8);

        \Config::set('database.default', 'archive');

        echo 'Creating tenant ' . $i . "\r\n";

        Tenant::create([
            'name'          => $company,
            'description'   => $description,
            'logo'          => $logo,
            'username'      => $username,
        ]);

        DB::statement('CREATE DATABASE ' . $username);

        \Config::set('database.connections.tenant.database', $username);
        \Config::set('database.default', 'tenant');

        echo 'Migrating tenant ' . $i . "\r\n";

        \Artisan::call('migrate', [
            '--path' => 'database/migrations/tenants'
        ]);

        echo "\r\n";
    }
}

我在这里做错了什么。第一次就完美运行。然后最后两次仅创建数据库但不迁移。仅第一个 DB 从中成功迁移。 artisan 不会抛出任何错误。

命令行输出如下:

Creating tenant 0

Migrating tenant 0


Creating tenant 1

Migrating tenant 1


Creating tenant 2

Migrating tenant 2

最佳答案

数据库连接在 Laravel 中保持事件状态,这意味着当您通过 config 更改数据库名称时,它不会切换到新数据库。您需要通过DB::connection($connection)->reconnect()强制后台连接重新连接。

运行迁移时,由于 Laravel 使用数据库名称和表名称来检查 migrations 表是否存在,因此您还需要更新当前连接的表名称。

就您而言:

# ...
\Config::set('database.connections.tenant.database', $username);
\Config::set('database.default', 'tenant');

\DB::reconnect();
\DB::setDatabaseName($username);
# ...

关于php - Seeder 第一次运行良好,但在 Laravel 5 的后续循环中不执行某些任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989103/

相关文章:

laravel - 如何将 Laravel 查询生成器中的子查询链接到外表

php - Laravel - 针对数据库中的日期范围的 PHP/MySQL 日期范围过滤器

php - 具有由下拉菜单填充的分页的表格

javascript - 日本字 rune 件名在文件上传php时变成未命名文件

php - 获取pdf中带有日期的姓名数量

c# - 查找数组中的重复值并将其全部输出

php - 在 PHP 中获取服务器的主机名或 IP 地址

C编译器通过运行优化循环

r - R 中的成对误差估计产生错误的乘积

laravel - 多态关系的表单模型绑定(bind)