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

标签 php laravel postgresql laravel-8 laravel-schema-builder

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

Schema::connection($this->tenant->getDatabaseConnection())->createDatabase($this->tenant->getDatabaseName())
所以$this->tenant->getDatabaseConnection()选择要添加租户的租户数据库服务器并返回该服务器的连接名称。然后$this->tenant->getDatabaseName()将返回该租户的数据库名称字符串。
我遇到了一个小问题。这会引发异常:

SQLSTATE[08006] [7] FATAL: database "port=5432" does not exist (SQL: create database "local_tenant_(id)" encoding "utf8")


这是因为默认情况下连接的数据库名称为空。当用户登录到他们的租户时,我们会从租户模型中动态地将 getDatabaseName() 注入(inject)其中。
但我不能在这里这样做,因为租户数据库还不存在。所以这里是我看到的选项:
  • 在创建新租户的数据库时,选择服务器上现有租户的随机数据库来“充当”。我真的不喜欢不得不像这样暂时劫持另一个租户的数据库,即使这应该对该租户产生 0 方面的影响。如果它是在服务器上配置的第一个租户,则没有现有的数据库可供使用,这使得这在我的书中是不可能的。
  • 我可以只使用 DB 提供程序 API 来创建租户 DB。这将是迄今为止最简单的,但会在本地和测试环境中中断,因此我想避免。
  • 我可以绕过 Laravel 并为此建立到数据库的直接 PDO 连接,但如果我找不到更好的东西,我会说这是我的最后手段。

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

    最佳答案

    正确的解决方法是连接到postgres数据库以运行 CREATE DATABASE . postgres数据库总是在那里(除非有人丢弃了它),这就是它的设计目的。

    关于php - 我可以在不先选择数据库的情况下使用 Laravel 的 Schema::createDatabase() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68359621/

    相关文章:

    php - 如何动态更改/解析 Laravel 5 中的数据库连接?

    database - Laravel 如何实时创建数据库,就像旧数据库一样,以及如何访问该数据库

    php - 使用构造函数版本时未调用 Laravel 中间件终止

    php - 使用 PhpStorm 创建和配置 Laravel 项目

    php - 我的 session ID 是在登录前生成的吗?

    php - MySQL 如果存在则更新一行,如果不存在则插入,以及一般查询建议

    ruby-on-rails - 查询 Postgres 数组列类型

    java - Postgres DB 触发器调用 Java 函数

    AS 的 SQL 语法错误

    PHP新手问题; "notice: undefined property"