You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

stancl/tenancy:从中心端检查租户数据库是否已存在

检查stancl/tenancy租户数据库是否已存在的实现方案

方案一:复用包内置的检查逻辑

stancl/tenancy提供的DatabaseManager->ensureTenantCanBeCreated($tenant)方法本身就包含数据库存在性校验,你可以在创建租户前主动调用该方法,通过捕获异常判断是否存在冲突:

use Stancl\Tenancy\Database\DatabaseManager;
use Stancl\Tenancy\Exceptions\TenantCouldNotBeCreatedException;

// 先构建租户实例,设置好用于生成数据库名的标识(如domain、database字段等)
$tenant = new \App\Models\Tenant();
$tenant->domain = 'example.test'; // 或其他租户唯一标识字段

$databaseManager = app(DatabaseManager::class);

try {
    $databaseManager->ensureTenantCanBeCreated($tenant);
    // 检查通过,执行后续租户创建流程
} catch (TenantCouldNotBeCreatedException $e) {
    if (str_contains($e->getMessage(), 'Database already exists')) {
        // 返回数据库已存在的错误提示
        return back()->withErrors('该租户对应的数据库已存在,请更换标识');
    }
    // 处理其他创建失败的异常场景
    return back()->withErrors($e->getMessage());
}

方案二:手动检查数据库存在性

如果你希望更直接地验证,可通过查询系统数据库的information_schema来判断目标数据库是否存在:

use Illuminate\Support\Facades\DB;

// 获取租户要创建的数据库名称(需和stancl/tenancy的生成逻辑完全一致)
$targetDatabase = $tenant->database; // 或按包的命名规则生成,比如tenant_{$tenant->id}

$databaseExists = DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?", [$targetDatabase]);

if (!empty($databaseExists)) {
    return back()->withErrors('该数据库已存在,请更换租户标识');
}

// 检查通过,继续执行租户创建操作

注意事项

  • 手动检查时,需确保当前数据库用户拥有查询INFORMATION_SCHEMA.SCHEMATA的权限,否则会导致校验失败。
  • 若数据库名称由stancl/tenancy自动生成(比如基于租户ID或域名),需保证你获取的$targetDatabase和包的生成逻辑完全匹配,避免出现校验偏差。

内容的提问来源于stack exchange,提问作者lavou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:52:34