引用
http://blog.csdn.net/jake451/article/details/6117272
需求:原网站功能庞大,数据库服务器与数据库众多
问题:YII单DB方式已经满足不了我们的需求,急切需要对YII进行扩展设计,支持多DB方式
解决方法:
1、在protected/components目录下新建Ar.php脚本文件。
view plaincopy to clipboardprint?
01.<?php
02.class Ar extends CActiveRecord
03.{
04. static $database = array();
05. public $dbname = 'db';
06. public function __construct($scenario='insert', $dbname = '')
07. {
08. if (!emptyempty($dbname))
09. $this->dbname = $dbname;
10.
11. parent::__construct($scenario);
12. }
13.
14. public function getDbConnection()
15. {
16. $dbname = $this->dbname;
17. if (self::$database[$dbname]!==null)
18. {
19. return self::$database[$dbname];
20. }
21. else
22. {
23. if ($this->dbname == 'db')
24. {
25. self::$database[$dbname] = Yii::app()->getDb();
26. }
27. else
28. {
29. self::$database[$dbname] = Yii::app()->$dbname;
30. }
31.
32. if(self::$database[$dbname] instanceof CDbConnection)
33. {
34. self::$database[$dbname]->setActive(true);
35. return self::$database[$dbname];
36. }
37. else
38. throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
39. }
40. }
41.}
<?php
class Ar extends CActiveRecord
{
static $database = array();
public $dbname = 'db';
public function __construct($scenario='insert', $dbname = '')
{
if (!empty($dbname))
$this->dbname = $dbname;
parent::__construct($scenario);
}
public function getDbConnection()
{
$dbname = $this->dbname;
if (self::$database[$dbname]!==null)
{
return self::$database[$dbname];
}
else
{
if ($this->dbname == 'db')
{
self::$database[$dbname] = Yii::app()->getDb();
}
else
{
self::$database[$dbname] = Yii::app()->$dbname;
}
if(self::$database[$dbname] instanceof CDbConnection)
{
self::$database[$dbname]->setActive(true);
return self::$database[$dbname];
}
else
throw new CDbException(Yii::t('yii','Active Record requires a "db" CDbConnection application component.'));
}
}
}
2、数据库配置
为了方便与清晰我们的数据库配置文件,我们将数据库配置文件与main.php文件进行分离。
(1)首先我们看看main.php文件的配置,代码如下
view plaincopy to clipboardprint?
01.<?php
02.$config = array(
03. 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
04. 'name'=>'My Web Application',
05. //...此处代码已省略,去掉components里面的db文件配置
06. );
07.
08.$database = @include_once dirname(__FILE__).'/database.php';
09.if(!emptyempty($database))
10.{
11. $config['components'] = @array_merge($config['components'], $database);
12.}
13.return $config;
<?php
$config = array(
'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
'name'=>'My Web Application',
//...此处代码已省略,去掉components里面的db文件配置
);
$database = @include_once dirname(__FILE__).'/database.php';
if(!empty($database))
{
$config['components'] = @array_merge($config['components'], $database);
}
return $config;
(2)在配置文件目录(protected/config),新建database.php脚本文件,代码如下
view plaincopy to clipboardprint?
01.<?php
02.return array(
03. /** 默认数据库 */
04. 'db'=>array(
05. 'connectionString' => 'dblib:host=test;dbname=test',
06. 'emulatePrepare' => false,
07. 'username' => 'user',
08. 'password' => 'pass',
09. 'charset' => 'gbk',
10. ),
11. /** mysql配置 */
12. /*'shop'=>array(
13. 'connectionString' => 'mysql:host=mysql.data.com;dbname=test1',
14. 'emulatePrepare' => true,
15. 'username' => 'root',
16. 'password' => '123456',
17. 'charset' => 'utf8',
18. 'tablePrefix' => '',
19. ),*/
20.
21. /** mssql配置 */
22. 'test1'=>array(
23. 'connectionString' => 'dblib:host=testHostname;dbname=test1',
24. 'emulatePrepare' => false,
25. 'username' => 'user',
26. 'password' => 'pass',
27. 'charset' => 'gbk',
28. ),);
<?php
return array(
/** 默认数据库 */
'db'=>array(
'connectionString' => 'dblib:host=test;dbname=test',
'emulatePrepare' => false,
'username' => 'user',
'password' => 'pass',
'charset' => 'gbk',
),
/** mysql配置 */
/*'shop'=>array(
'connectionString' => 'mysql:host=mysql.data.com;dbname=test1',
'emulatePrepare' => true,
'username' => 'root',
'password' => '123456',
'charset' => 'utf8',
'tablePrefix' => '',
),*/
/** mssql配置 */
'test1'=>array(
'connectionString' => 'dblib:host=testHostname;dbname=test1',
'emulatePrepare' => false,
'username' => 'user',
'password' => 'pass',
'charset' => 'gbk',
),);
(3)在使用的时候,我们需要对model文件进行简单的修改。
a、将继承文件类换成Ar
b、给model添加属性$dbname设置所在数据库配置文件名称(不设置则为默认DB)
实例代码如下:
view plaincopy to clipboardprint?
01.<?php
02.class test extends Ar
03.{
04. //设置处理所在数据库,不设置为默认DB
05. $dbname = 'test1';
06. //...省略代码若干行
07.}
分享到:
相关推荐
Android之仿网易V3.5新特性http://blog.csdn.net/way_ping_li/article/details/9359191 我只是重新测试了一下,感觉可以用。 只是要注意,需要导入-v4.jar包,并且VerticalViewPagerCompat.java一定要放在android....
资源分类:Python库 所属语言:Python 资源全名:jake-0.2.46-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:jake-0.2.5-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
Rxbinding2的support,v7全部集合打包module,配合的是Rxjava2。 http://blog.csdn.net/niubitianping/article/details/56014611
jakewharton大神的力作,安卓里面的视图注入库,简化代码利器http://blog.csdn.net/tbl19930927/article/details/23989179
利用Qt + OpenGL 渲染 YUV数据,实现可以设置视频宽高比,播放视频 mac版,说明文档:https://blog.csdn.net/jake2012/article/details/60136081#comments
如果有任何疑问,可以参考博客链接(http://blog.csdn.net/lmj623565791/article/details/42160391)上的详细教程,或者直接在博客下留言提问。 总之,通过自定义控件实现ViewPagerIndicator,不仅可以增强应用的...
参考博客文章《Android平台下使用TessTwo实现OCR功能》(http://blog.csdn.net/duanbokan/article/details/50738711),可以了解到更具体的实现细节和示例代码。在实际开发中,开发者应结合这个教程和TessTwo的官方...
在给出的链接中(http://blog.csdn.net/zxw136511485/article/details/52196400), 作者详细介绍了如何在Android项目中集成和使用DiskLruCache。以下是集成和使用的关键步骤: 1. **初始化**:在应用程序启动时,...
【DiskLruCache简介】 DiskLruCache是Android系统中用于缓存的一种...通过提供的博客链接(http://blog.csdn.net/pangzaifei/article/details/38514681),你可以进一步深入学习DiskLruCache的使用细节和实践案例。