有没有另一种方法可以在雄辩的模型上“设置连接”?

2022-08-31 00:40:10

我目前正在处理一个“多数据库动态交换连接”类型的项目。

因此,我最终要做的是以下内容:

$connectionName = uniqid();
\Config::set('database.connections.' . $connectionName, [/** db options **/]);
\Artisan::call('migrate', ['--database' => $connectionName]);

$connectionName = uniqid();           
\Config::set('database.connections.' . $connectionName,[/** db options **/]);

$user = new User();
$user->setConnection($connectionName);
$user->first_name = 'Daisy';
$user->last_name = 'Demo';
$user->is_not_being_ignored_by_santa_this_year = 0;
$user->email = //and so so on
$user->save();

对于 Artisan 调用,我有点理解为什么 Laravel 需要引用字符串中的连接,并保存在配置数组中。

然而,在雄辩模型本身上,我发现必须将我的数据库连接写入配置数组中会很麻烦。因此,可以通过“单例方法”\Config::get().来获取它。在模型中。

有没有更优雅的东西,我可以直接注入配置,而不必将其写入某个超级全局?

还是我错过了什么?


答案 1

您可能最好为每个连接创建一个配置数组,然后通过指定要使用的连接来非常轻松地在连接之间切换。

如果需要在同一模型上使用多个连接,则可以使用 on 方法

所以它会像这样User::on('dbconnection2')->find(1)

如果只想对不同的模型使用不同的连接,则可以在模型上设置受保护的属性:$connection

class User extends Model
{
    protected $connection = 'dbconnection2';
}

希望有所帮助。


答案 2

您可以为模型创建一个工厂,并在引导应用时将其传递连接:

<?php

class ModelFactory
{
    private $db;

    public function __construct($dbConnection)
    {
        $this->db = $dbConnection;
    }

    public function createNewModel($class)
    {
        $object = new $class();
        $object->setConnection($this->db);
        return $object;
    }
}

然后在您的代码中:

$user = $factory->createModel(User::class);

像这样的东西!祝你好运!:-)


推荐