如何查询所有多租户数据库?

cetgtptt  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(455)

我在用 hyn/laravel-tenancy 包,它为每个客户生成单独的表。在管理面板,我想能够访问所有客户数据库的数据。在官方文档中找不到解决方案,也找不到很好的做法,因此提出了以下建议:

$users = DB::table('users'); //System connection

    foreach (Website::all() as $w) {

        // for each tenant
        // setup a temporary connection

        config([
            'database.connections.' . $w->uuid => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', '127.0.0.1'),
                'port' => env('DB_PORT', '3306'),
                'database' => $w->uuid,
                'username' => env('DB_USERNAME', 'root'),
                'password' => env('DB_PASSWORD', ''),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
                'prefix' => '',
                'strict' => true,
                'engine' => null,
            ]
        ]);

        $w_connection = DB::connection($w->uuid)->table('users');

        $users = $users->unionAll($w_connection);
    }

    return $users->get();

现在我只有一个租户表,一个用户在系统表中,一个在租户表中。结果,我得到了用户表单系统表两次。

vxf3dgd4

vxf3dgd41#

好吧,看来你不能合并来自两个不同连接的查询。但我在这篇文章中找到了解决办法。

$users = DB::table('tenancy2.users');

    foreach (Website::all() as $w) {
        $tenant_users = DB::table($w->uuid . '.users');
        $users = $users->union($tenant_users);
    }

    return $users->get();

显然,如果您在表之前指示db,则可以使用connection来访问该特定连接中未指定的db。

相关问题