首页 > 解决方案 > 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 实例中运行上述命令,它将正常工作。它必须与模型缓存或类似的东西有关。

标签: mongodblaravel

解决方案


要回答我自己的问题,问题是我动态更改了配置,但连接实例仍然存在。我将不得不强制连接重新连接以加载新配置。

所以代码一定是这样的:

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);
}

推荐阅读