Spatie Multi Tenancy执行租户命令时报Call to a member function prepare() on null错误
问题原因
这个报错是你在同一个Web请求生命周期内执行租户切换操作后,数据库连接实例被异常重置导致的:
- 执行
tenants:artisan命令时,Spatie多租户包会自动切换当前请求的数据库连接到新租户,命令执行完成后没有自动切回原始的landlord连接,且原连接持有的PDO实例被置空。终端执行命令是独立进程,执行完成后直接退出不会有后续操作,所以不会报错;但Livewire的Web请求执行完命令后,后续还要执行会话写入、请求收尾等依赖数据库的操作,此时调用已被置空的PDO实例的prepare()方法就会触发该错误。
解决方案
你可以任选以下一种方法修复:
- 手动结束租户上下文,切回landlord连接
执行完两个Artisan命令后,追加以下代码重置连接:// 结束当前租户上下文,恢复原始连接 tenancy()->end(); // 清空租户连接缓存 DB::purge('tenant'); // 重新连接landlord数据库确保连接有效 DB::reconnect('landlord'); - 将租户创建、迁移的操作放到队列异步执行
避免在同步Web请求生命周期内切换数据库连接,队列任务是独立进程执行,不会影响当前请求的连接状态。 - 使用
Artisan::queue替代Artisan::call执行命令
原理和异步队列逻辑一致,避免当前请求内连接被切换篡改。
内容的提问来源于stack exchange,提问作者Finchy70
相关产品推荐
相关产品推荐

