Cakephp 3动态更改数据库连接?它有效吗?

时间:2014-09-08 16:51:53

标签: php mysql database cakephp

有没有办法动态更改数据库连接?它有效吗? 我们的客户拥有多个数据库。它们各自包含相同的结构,但我们将它们分开以在我们的应用程序和安全性目的中使用相同的类。有没有比切换数据库连接更好的方法呢?也许将它们全部放在一个数据库中,并为每个表使用前缀。我可以动态更改数据库前缀吗?

编辑: 提供有关我的情况的更多信息。我们的客户有多个商店,他需要在一个应用程序中连接。目前,我们在不同的应用程序中显示每个商店。因为当时他只有一个,现在他有三个。每个商店都有自己的数据库。这有帮助吗?

1 个答案:

答案 0 :(得分:1)

我也有这个问题,我在这里记录我的解决方案。

我想对这个问题给出2个答案。第一个是对问题的实际答案(种类),“如何动态更改数据库?”,我不明白为什么效率低于替代方案。

第二个选项是处理多个连接的更灵活方式,(在我看来)允许您更好地定义数据类型。

对于这两个选项,您需要在config / app.php中定义所有数据源。

您可以将连接选项传递给TableRegistry :: get

// controller code - you would need to implement Stores::getConnectionName
$storeConnection = $this->Stores->getConnectionName($data);
$stores = TableRegistry::get('Stores', ['connection' => $storeConnection]);

这还要求所有数据库中的表名都相同。

您可以创建一个父表类,其中包含处理商店数据的所有逻辑,并为每个商店扩展它。

// App\Model\Table\BaseStoreTable
use Cake\ORM\Table;
class BaseStoreTable extends Table {

}

// App\Model\Table\StoreOneTable
use App\Model\Table\BaseStoreTable;
class StoreOneTable extends BaseStoreTable {
    public static function defaultConnectionName() {
        return 'store_one';
    }
}

// App\Model\Table\StoreTwoTable
use App\Model\Table\BaseStoreTable;
class StoreTwoTable extends BaseStoreTable {
    public static function defaultConnectionName() {
        return 'store_two';
    }
}

您仍然需要实现一种确定使用哪个类的方法,并且有多种方法可以处理它。如果数据源存在其他差异,这将为您提供更多灵活性。

相关问题