在Eloquent模型上还有另一种"setConnection"的方法吗?

chi*_*lli 10 php mysql eloquent laravel-5

我目前正在处理一个"飞行交换连接的多数据库"项目.

所以我最终做的是以下内容:

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

要么

$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();
Run Code Online (Sandbox Code Playgroud)

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

但是在Eloquent Model本身上,我发现将数据库连接编写到配置数组中有点麻烦.所以它可以通过模型中的"Singleton方法"\ Config :: get()..来获取.

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

或者我错过了什么?

Bry*_*yan 12

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

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

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

如果您只想为不同的模型使用不同的连接,可以$connection在模型上设置protected 属性:

class User extends Model
{
    protected $connection = 'dbconnection2';
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


del*_*8uk 5

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

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

$user = $factory->createModel(User::class);
Run Code Online (Sandbox Code Playgroud)

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

  • 这相当光滑。 (2认同)