首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cakephp 2多数据库

Cakephp 2多数据库
EN

Stack Overflow用户
提问于 2012-08-13 20:57:09
回答 4查看 4.3K关注 0票数 1

我想根据域切换DB,从另一个DB中选择凭据,但我不能切换..

AppController.php

代码语言:javascript
运行
复制
// Select username, password and database based on domain
$this->Company->find('first', [...]);

if ($company) {
    // Connect to second database, droping connection from first.
    $dataSource = ConnectionManager::getDataSource('default');
    $dataSource->config['login'] = $company['Company']['dbuser'];
    $dataSource->config['password'] = $company['Company']['dbpass'];
    $dataSource->config['database'] = $company['Company']['dbname'];

    /**
     * PROBLEM START HERE:
     * Here, need to use new database settings, and, this case
     * Company table does not exists, but I always get it, so,
     * I think I am connected with the first and not second connection.
     */
    print_r($this->Company->find('first'));
}

我怎么才能纠正这个问题?

编辑

我尝试过,但没有成功:

代码语言:javascript
运行
复制
ConnectionManager::drop('default');
ConnectionManager::create('default', $settings);

print_r(ConnectionManager::create('default', $settings))返回:

代码语言:javascript
运行
复制
[... lots of things ... ]
[config] => Array
    (
        [persistent] => 
        [host] => localhost
        [login] => login
        [password] => password
        [database] => database
        [port] => 3306
        [datasource] => Database/Mysql
        [prefix] => 
    )
[... more things ... ]

编辑2

现在,我可以切换数据库,但是,公司模型总是得到旧的数据库设置。

FooController.php

代码语言:javascript
运行
复制
<?php
App::uses('AppController', 'Controller');

class FooController extends AppController {
    var $uses = array('Foo', 'Company');

    public function index() {
        echo'<pre>';
        print_r($this->Company->find('first')); // Here I get from old settings
        print_r($this->Foo->find('first')); // Here I gete from new settings
        echo'</pre>';

        $this->layout = false;
        $this->render(false);
    }
}

AppController.php

代码语言:javascript
运行
复制
public function beforeFilter() {
    $company = ClassRegistry::init('Company')->find('first');
    $settings = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => $company['Company']['dbuser'],
        'password' => $company['Company']['dbpass'],
        'database' => $company['Company']['dbname'],
        'prefix' => ''
    );

    ConnectionManager::getDataSource('default')->disconnect();

    ConnectionManager::drop('default');
    ConnectionManager::create('default', $settings);

    ConnectionManager::getDataSource('default')->connect();
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-14 01:46:47

看起来,您需要动态地创建一个配置,并动态地更改信任。我不知道这是否可行,但它可能会让你找到答案。

首先,我们需要为要使用的数据源创建一个配置。为此,我们可以使用连接管理器::创建

接下来,我们需要立即改变信任,为此我们可以使用模型::setDataSource

我还没试过,但看起来应该行。如果有问题,请留下评论,这样我就可以更新答案。

编辑:这可能不起作用,因为每个模型都需要更改为新数据源。有一个ConnectionManager::drop()方法,您可以使用它来删除default配置,然后使用ConnectionManager::create('default', array(...));来使用新的默认设置。

票数 1
EN

Stack Overflow用户

发布于 2012-08-14 22:20:36

您可以在数据库配置文件中切换数据库。

将Config/database.php文件配置如下:

代码语言:javascript
运行
复制
<?php
class DATABASE_CONFIG {

    // config for e.g. localhost
    public $default = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'root',
        'password' => 'xxxxx',
        'database' => 'cake',
        'encoding' => 'utf8'
    );

    // DB config specifically for your domain
    public $domain_x = array(
        'datasource' => 'Database/Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'login' => 'username_at_hosting_provider',
        'password' => '087bJ#ytvh&^YU#T',
        'database' => 'blabla_cake',
        'encoding' => 'utf8'
    );

    public function __construct(){
        // switch config depending on domain / env('HTTP_HOST')
        if(env('HTTP_HOST')=='domain_x.com'){
            $this->default = $this->domain_x;
        }
        // otherwise keep $this->default
    }
}

编辑:

回答你的问题似乎有点太快了:它并没有真正涵盖你的问题。抱歉的!

票数 1
EN

Stack Overflow用户

发布于 2013-08-29 13:30:39

好的,我设法修复了这个问题,创建了__construct函数AppModel,并将所有代码放到默认数据源中,然后使用新的配置创建另一个配置。就像这样:

AppModel.php

代码语言:javascript
运行
复制
public function __construct($id = false, $table = null, $ds = null)
{
    App::uses('CakeSession', 'Model/Datasource');

    parent::__construct($id, $table, $ds);

    if ($this->useDbConfig == 'default') {
        // Change the datasource config
        $user = CakeSession::read('Auth.User');
        $this->changeDataSource($user);
    }
}



public function changeDataSource($config)
{ 
    ...
    ...
    ...
    $dados = array();
    $dados['database']   = $config['titulo_bd'];
    $dados['host']       = $config['host_bd'];
    $dados['login']      = $config['login_bd'];
    $dados['password']   = $config['senha_bd'];
    $dados['datasource'] = 'Database/Mysql';
    $dados['persistent'] = false;
    $dados['prefix']     = '';
    $dados['encoding']   = 'utf8';


    ConnectionManager::create('default', $dados);
    ConnectionManager::getDataSource('default')->connect();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11942189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档