What would you do if you want/need to have a different than the main database connection in an module's models?
Let's say we create a module with name test under the protected/modules/ folder.
In your config file you can declare a module like:
'modules'=>array(•••••• 'test'=>array( 'db'=>array( 'class'=>'CDbConnection', 'connectionString'=>'sqlite:'.dirname(__FILE__).'/../modules/bliig/data/blog.db', ), ),
Important: The 'class'=>'CDbConnection' is required, for this simple implementation.
In your TestModule.php file ( the class that extends the CModule ) under the protected/modules/test
folder, declare a public property named db.
class TestModule extends CModule { public $db; ... }
Then you have to simple change the CActiveRecord class your module's models extends to EModuleActiveRecord
class EModuleActiveRecord extends CActiveRecord { public function getDbConnection() { $db = Yii::app()->controller->module->db; return Yii::createComponent($db); } }
In this scenario we had a module that we wanted to change database for, but the extension of the CActiveRecord and the
override of the getDdConnection() is common general a common case.
Make sure you import the EModuleActiveRecord. If you have generated the module with gii, just add file under the
components or models folder.
Total 2 comments
Great entry, although I've been getting the following SQL error:
In my module I have a page that requires a lot of queries to be run (fetching a lot of unrelated models from the db) and I was getting an SQL too many connections error. I think, although I may be wrong, that this is because the system was opening a new database connection for every model I loaded.
Rather than increasing the 'max connections' value for the MySQL server, I found another way around. Instead of adding the db connection as as param of the module, I added it as a db connection in the main site configuration, next to the original database connection;
Adding the
$dbproperty to my module file, and also extending all models within the module fromEModuleActiveRecord, as you have stated. However I've edited thegetDbConnection()method withinEModuleActiveRecordlike so:This sets the DB connection to the global application moduleDb, and doesn't create a new connection with every model.
Thanks a lot. It was very usefull for me.
Roberto
Leave a comment
Please login to leave your comment.