如何使用相同的模型管理laravel中的多个数据库?

时间:2016-07-13 08:51:14

标签: php laravel laravel-5 eloquent laravel-5.1

我有一个应用程序,我有几个在不同服务器上运行的实例。我现在正在创建一个管理应用程序来连接这些应用程序,以创建和编辑Users表等数据。

当管理员登录管理面板时,他们可以选择要连接的数据库,将其带到一个页面,在那里他们可以选择要在该数据库上执行的操作。

目前我设置会话变量来存储所选数据库,然后重写模型构造函数以在每个模型中设置$ connection变量。

/**
 * The connection name for the model.
 *
 * @var string
 */
protected $connection;

/**
 * Create a new Eloquent model instance.
 *
 * @param  array  $attributes
 * @return void
 */
public function __construct(array $attributes = [])
{
    if(session('connection')){
        $this->setConnection(session('connection'));
    }

    parent::__construct($attributes);
}

此解决方案适用于大多数表和模型,但对于users表,我遇到了需要访问本地管理员用户数据并与远程用户模型交互的问题,这意味着我需要为每个操作建立不同的连接。 / p>

我能想到的唯一解决方案是设置一个名为isExternalOperation的第二个会话变量,并在需要访问另一个数据库时将其设置为true,但这会导致很多重复的代码。 e.g。

session('isExternalOperation' => true]);
// Create new User or something else
session('isExternalOperation' => false]);

我的模型构造函数如下所示:

/**
 * Create a new Eloquent model instance.
 *
 * @param  array  $attributes
 * @return void
 */
public function __construct(array $attributes = [])
{
    if(session('connection') && session('isExternalOperation')){
        $this->setConnection(session('connection'));
    }

    parent::__construct($attributes);
}

有没有更好的方法来解决这个问题,因为这似乎是一个不好的方法呢?

1 个答案:

答案 0 :(得分:0)

一种解决方案是创建抽象的LocalConnectionModelExternalConnectionModel类,这将在其构造函数中设置正确的数据库连接。然后,在模型中,您只会继承适当的抽象模型:

    用户
  • LocalConnectionModel
  • ExternalConnectionModel用于使用外部数据库的其他模型