小编Jam*_*645的帖子

我可以在不先选择数据库的情况下使用 Laravel 的 Schema::createDatabase() 吗?

我这里有一个先有鸡还是先有蛋的问题。我正在 Laravel 中构建一个多租户应用程序,其中每个租户在 Postgrsql 服务器上都有自己的数据库。所以我有一份工作来创建一个新的租户,它调用:

Schema::connection($this->tenant->getDatabaseConnection())->createDatabase($this->tenant->getDatabaseName())
Run Code Online (Sandbox Code Playgroud)

因此$this->tenant->getDatabaseConnection(),选择一个租户数据库服务器来添加租户并返回该服务器的连接名称。然后$this->tenant->getDatabaseName()将返回该租户的数据库名称字符串。

我遇到了一个小问题。这会引发异常:

SQLSTATE[08006] [7] 致命:数据库“port=5432”不存在(SQL:创建数据库“local_tenant_(id)”编码“utf8”)

这是因为默认情况下连接的数据库名称为空。当用户登录到他们的租户时,我们动态地将租户模型中的 getDatabaseName() 注入其中。

但我不能在这里这样做,因为租户数据库尚不存在。所以这是我看到的选项:

  1. 在创建新租户的数据库时,选择服务器上现有租户的随机数据库作为“充当”。我真的不喜欢劫持另一个租户的数据库,即使是暂时的,尽管这应该对该租户产生 0 副作用。如果它是在服务器上配置的第一个租户,则没有可用的现有数据库,这使得这在我的书中是不可行的。

  2. 我可以使用数据库提供商 API 来创建租户数据库。这将是迄今为止最简单的,但会在本地和测试环境中中断,因此我想避免。

  3. 我可以绕过 Laravel 并为此建立与数据库的直接 PDO 连接,但我想说,如果我找不到更好的东西,这是我的最后手段。

从技术上讲,您不必选择数据库即可使用创建数据库命令。这是 Laravel 架构生成器的一个特性,它会在调用方法之前尝试选择数据库(在本例中为 CreatedDatabase)。有没有办法解决这个问题,这样我就可以在 Laravel 不首先尝试选择空数据库的情况下创建数据库?

php postgresql laravel laravel-schema-builder laravel-8

5
推荐指数
1
解决办法
684
查看次数