Laravel-根据存储在数据库中的设置处理作业中的多个Eloquent Model DB连接

问题描述

我的多租户Laravel 7 / mysql应用程序中有两种模型,例如:

  • Company->使用默认的连接/中央数据库,并配置为默认方式。
  • CompanySettings->属于Company-使用默认的连接/中央数据库,配置默认的方式-还保存Company的特定数据库的连接凭据。
  • Category->属于Company-它存储在特定的数据库中,专门为每个公司创建。连接凭据存储在CompanySettings中。

现在,当我创建http请求时,我能够基于主机识别公司,并且在中间件中,我将辅助连接凭据设置为存储在CompanySettings中的凭据。

但是,我的某些请求触发了排队事件(发送通知),该事件将Models与辅助连接一起使用。由于已排队事件作为后台作业运行,没有中间件,因此第二连接未填充正确的连接数据。注意:我在事件/通知上附加了Company,因此我可以识别公司,但是在这种情况下为模型设置数据库连接的正确方法在哪里,以便不触发以下错误?

使用的堆栈:Laravel 7,Mysql db,数据库中的作业

InvalidArgumentException: Database connection [specific] not configured. in /backend/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:152
Stack trace:
#0 /backend/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(115): Illuminate\Database\DatabaseManager->configuration('specific')
#1 /backend/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php(86): Illuminate\Database\DatabaseManager->makeConnection('specific')
#2 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1344): Illuminate\Database\DatabaseManager->connection('specific')
#3 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1310): Illuminate\Database\Eloquent\Model::resolveConnection('specific')
#4 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1116): Illuminate\Database\Eloquent\Model->getConnection()
#5 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1033): Illuminate\Database\Eloquent\Model->newBaseQueryBuilder()
#6 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1069): Illuminate\Database\Eloquent\Model->newModelQuery()
#7 /backend/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1095): Illuminate\Database\Eloquent\Model->newQueryWithoutScopes()
#8 /backend/vendor/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php(114): Illuminate\Database\Eloquent\Model->newQueryForRestoration('a6329055-dfb2-4...')
#9 /backend/vendor/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php(101): App\Notifications\BtrNotification->getQueryForModelRestoration(Object(App\Models\Fe\TaskCompleter\FeTaskCompleterTaskRequest),'a6329055-dfb2-4...')
#10 /backend/vendor/laravel/framework/src/Illuminate/Queue/SerializesAndRestoresModelIdentifiers.php(57): App\Notifications\BtrNotification->restoreModel(Object(Illuminate\Contracts\Database\ModelIdentifier))
#11 /backend/vendor/laravel/framework/src/Illuminate/Queue/SerializesModels.php(122): App\Notifications\BtrNotification->getRestoredPropertyValue(Object(Illuminate\Contracts\Database\ModelIdentifier))
#12 [internal function]: App\Notifications\BtrNotification->__unserialize(Array)
#13 /backend/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(53): unserialize('O:48:"Illuminat...')
#14 /backend/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(98): Illuminate\Queue\CallQueuedHandler->call(Object(Illuminate\Queue\Jobs\DatabaseJob),Array)
#15 /backend/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(356): Illuminate\Queue\Jobs\Job->fire()
#16 /backend/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(306): Illuminate\Queue\Worker->process('database',Object(Illuminate\Queue\Jobs\DatabaseJob),Object(Illuminate\Queue\WorkerOptions))
#17 /backend/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(132): Illuminate\Queue\Worker->runJob(Object(Illuminate\Queue\Jobs\DatabaseJob),'database',Object(Illuminate\Queue\WorkerOptions))
#18 /backend/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(112): Illuminate\Queue\Worker->daemon('database','mail',Object(Illuminate\Queue\WorkerOptions))
#19 /backend/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(96): Illuminate\Queue\Console\WorkCommand->runWorker('database','mail')
#20 [internal function]: Illuminate\Queue\Console\WorkCommand->handle()
#21 /backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): call_user_func_array(Array,Array)
#22 /backend/vendor/laravel/framework/src/Illuminate/Container/Util.php(37): Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
#23 /backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(95): Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
#24 /backend/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(39): Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application),Array,Object(Closure))
#25 /backend/vendor/laravel/framework/src/Illuminate/Container/Container.php(596): Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application),NULL)
#26 /backend/vendor/laravel/framework/src/Illuminate/Console/Command.php(134): Illuminate\Container\Container->call(Array)
#27 /backend/vendor/symfony/console/Command/Command.php(258): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput),Object(Illuminate\Console\OutputStyle))
#28 /backend/vendor/laravel/framework/src/Illuminate/Console/Command.php(121): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput),Object(Illuminate\Console\OutputStyle))
#29 /backend/vendor/symfony/console/Application.php(920): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#30 /backend/vendor/symfony/console/Application.php(266): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand),Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#31 /backend/vendor/symfony/console/Application.php(142): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#32 /backend/vendor/laravel/framework/src/Illuminate/Console/Application.php(93): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#33 /backend/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(129): Illuminate\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#34 /backend/artisan(37): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput),Object(Symfony\Component\Console\Output\ConsoleOutput))
#35 {main}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)