这适用于Kohana v3.2
如何动态选择ORM模型连接的数据库?具体来说,我正在尝试更改ORM模型以在本地开发,登台和生产环境中使用数据库。
Kohana Guide告诉我可以通过在ORM模型上设置受保护属性来设置数据库连接,如下所示:
class Model_Customer extends ORM
{
protected $_db_group = 'local_db';
protected $_table_name = 'customer';
这在本地开发时效果很好,但是当我进入舞台然后制作时呢?我每次更改环境时都不必更改_db_group。我可以检查服务器变量以确定环境,但我还没有找到一种方法来动态设置db_group属性以匹配环境,因为我无法在类定义中执行任何逻辑。
我可能有更好的方法来解决这个问题,我希望有人能够提出建议。谢谢。
答案 0 :(得分:1)
在我看来,请检查database.php
配置文件中的连接。
return array
(
'default' => array
(
'type' => 'MySQL',
'connection' => array(
/**
* The following options are available for MySQL:
*
* string hostname server hostname, or socket
* string database database name
* string username database username
* string password database password
* boolean persistent use persistent connections?
* array variables system variables as "key => value" pairs
*
* Ports and sockets may be appended to the hostname.
*/
'hostname' => 'localhost',
'database' => (Kohana::$environment == Kohana::DEVELOPMENT) ? 'local_db' : 'kohana',
'username' => FALSE,
'password' => FALSE,
'persistent' => FALSE,
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => FALSE,
),
);
答案 1 :(得分:0)
正如我在mobal's answer的评论中所说的那样,在使用相同的逻辑时,我会采取略微不同的方法。
您可以在documentation中看到可以有多个数据库配置。在这种情况下,它可能看起来像这样
return array(
'default' => array( /* regular connection */ ),
Kohana::DEVELOPMENT => array( /* connection for development */ )
);
现在问题是:在哪里应该使用逻辑来决定使用哪个连接?首先我认为ORM
课程会是个好地方 - 但实际上我对此表示怀疑。模型不应该关注,使用哪种连接。
然而,Database::instance()
看起来正确。这是确定将使用哪种配置的方法。所以在这里更改它将影响使用数据库的所有内容 - 所以这是完美的地方。
由于Kohana使用包装类,您可以创建文件APPPATH/classes/Database.php
并在此处添加更改
class Database extends Kohana_Database {
public static function instance($name = NULL, $config = NULL) {
if ($name === NULL && Kohana::$environment == Kohana::DEVELOPMENT) {
$name = Kohana::DEVELOPMENT;
}
return parent::instance($name, $config);
}
}
现在,只要您尝试获取默认实例(如果未设置_db_group
,则在ORM中就是这种情况)和在开发环境中,开发配置将用于连接到您的数据库。
答案 2 :(得分:-1)
感谢大家的想法。
我的用例涉及使用数据库配置文件,该文件引用6个不同的数据库(2个数据库乘以3个环境)。
对于我的特定情况,这是我可以提供的最简单的解决方案,而不用担心可能会在应用程序的其他区域中污染数据库连接
伪代码:
public function __construct()
{
if ($_SERVER['HTTP_HOST'] == 'staging.acme.com')
{
$this->_db_group = 'db1_stage';
}
else if ($_SERVER['KOHANA_ENV'] == 'development')
{
$this->_db_group = 'db1_local';
}
else
{
$this->_db_group = 'db1_production';
}
parent::__construct();
}
这在调用$_db_group
之前设置parent::construct()
属性,它使用我需要的DB初始化ORM的数据库连接。