-
Notifications
You must be signed in to change notification settings - Fork 0
Extending Database Drivers
Category:Databases Category:Database Drivers
Much complaints about not being able to extend the CI database class. In the docs it says this can't be done, but here is a simple solution that fits it all! [b]Don't believe it?, well read on..[/b]
[size=4][b]The solution comes in 3 simple steps:[/b][/size]
- If you haven't already extended your loader class, you do so by creating the file MY_Loader.php into your libraries directory in the application path. It's content is at first:
[code] <?php
class MY_Loader extends CI_Loader {
}
?> [/code]
- Then you add the following function to your MY_Loader class:
[code] /** * Database Loader * * @access public * @param string the DB credentials * @param bool whether to return the DB object * @param bool whether to enable active record (this allows us to override the config setting) * @return object */ function database($params = '', $return = FALSE, $active_record = FALSE) { // Do we even need to load the database class? if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE) { return FALSE; }
require_once(BASEPATH.'database/DB'.EXT);
// Load the DB class
$db =& DB($params, $active_record);
$my_driver = config_item('subclass_prefix').'DB_'.$db->dbdriver.'_driver';
$my_driver_file = APPPATH.'libraries/'.$my_driver.EXT;
if (file_exists($my_driver_file))
{
require_once($my_driver_file);
$db =& new $my_driver(get_object_vars($db));
}
if ($return === TRUE)
{
return $db;
}
// Grab the super object
$CI =& get_instance();
// Initialize the db variable. Needed to prevent
// reference errors with some configurations
$CI->db = '';
$CI->db = $db;
// Assign the DB object to any existing models
$this->_ci_assign_to_models();
}
[/code]
- Now you are ready to create your Database driver extension class, that you name MY_DB_mysql_driver.php (or substitute the mysql part for whatever driver you use). Put this file also in your applications libraries directory:
[code] <?php
class MY_DB_mysql_driver extends CI_DB_mysql_driver {
function __construct($params){ parent::__construct($params); log_message('debug', 'Extended DB driver class instantiated!'); }
function get_first($table){ return $this->limit(1)->get($table); }
} ?> [/code]
There you are done! Congrats, now you can use your own db functions! Eg. the get_first(), the sample function from above, that just fetches the first entry from your table:
[code] $this->db->get_first('sometable'); [/code]