mongodb - Laravel jenssegers/laravel-mongodb 模型属性在更改数据库连接时未清除并运行另一个查询
问题描述
我将 jenssegers/laravel-mongodb 与 Laravel 5.6 一起使用,这很棒,但我有一个奇怪的问题。
我有一个带有这个静态函数的模型:
Class Trigger {
....
public static function onCustomer(User $customer)
{
config(['database.connections.' . $customer->server . '.database' => $customer->database]);
return self::on($customer->server);
}
}
如果我这样做:
$result = Trigger::onCustomer(User::find('573072804d358b06308b4567'))->get()
它将返回一个包含 2 个对象的集合 - 这是正确的!
然后,如果我这样做:
$result = Trigger::onCustomer(User::find('598e003a1736736644debbc7'))->get()
它将返回与上述相同的集合,但用户 598e003a1736736644debbc7 在数据库中没有任何记录。
如果我关闭 php artisan tinker 并再次运行第二个命令,它将返回空集合。哪个是对的。之后,如果我运行上面写的第一个命令,它将返回空集合,即使它有 2 个对象。
即使我运行 unset($result) 或 $result = null 并再次运行命令,它也不会带来正确的结果。
如何正确销毁变量或 Trigger 类对象,以便在第二次运行时会带来正确的结果?
我已经在 php artisan tinker 和浏览器中对此进行了测试。结果是一样的。
显然,如果我在单独的 php 实例中运行上述命令,它将正常工作。它必须与模型缓存或类似的东西有关。
解决方案
要回答我自己的问题,问题是我动态更改了配置,但连接实例仍然存在。我将不得不强制连接重新连接以加载新配置。
所以代码一定是这样的:
public static function onCustomer(User $customer)
{
DB::purge($customer->server);
config(['database.connections.' . $customer->server . '.database' => $customer->database]);
DB::reconnect($customer->server);
return self::on($customer->server);
}
推荐阅读
- qt - 使用 Qt Creator 配置 GNU Radio 和 UHD 项目
- influxdb - outflux 参数的语义 --output-conn
- java - Spring Data JPA 原生查询中的变量
- regex - 为什么将代码作为函数调用比在 Clozure Common lisp 中直接调用需要更长的时间?
- google-apps-script - 绕过对绑定到工作表的 GAS 的验证?
- python - keras.backend 的 clear_session() 方法没有清理拟合数据
- php - 如何使用 PHP 从 MS-SQL Server 数据库中获取数据?
- javascript - Javascript localStorage 替换数据而不是将数据附加到现有数据
- carrierwave - Carrierwave Fog 获取文件扩展名
- javascript - 如何在 SignalR 客户端中设置连接 ID?