마스터와 슬레이브로 DB 쪼게놓고 고민을 해봤습니다.
별도의 클래스로 구현하여 처리하면 되겠다 싶어 열심히 만들어 보는데....
이게 뭔 삽질이래 싶더군요.
그래서 그냥 단무지(단순, 무식, 지X...)로 처리 하기로 했습니다.
먼저 config/database.php 설정입니다.
$active_group = 'slave';
$active_record = TRUE;
$db['slave']['hostname'] = 'mysql:host=192.168.0.1;port=3306';
$db['slave']['username'] = 'test';
$db['slave']['password'] = 'test';
$db['slave']['database'] = 'test';
$db['slave']['dbdriver'] = 'pdo';
$db['slave']['dbprefix'] = '';
$db['slave']['pconnect'] = FALSE;
$db['slave']['db_debug'] = TRUE;
$db['slave']['cache_on'] = FALSE;
$db['slave']['cachedir'] = '';
$db['slave']['char_set'] = 'utf8';
$db['slave']['dbcollat'] = 'utf8_general_ci';
$db['slave']['swap_pre'] = '';
$db['slave']['autoinit'] = TRUE;
$db['slave']['stricton'] = FALSE;
$db['master']['hostname'] = 'mysql:host=192.168.0.2;port=3306';
$db['master']['username'] = 'test';
$db['master']['password'] = 'test';
$db['master']['database'] = 'test';
$db['master']['dbdriver'] = 'pdo';
$db['master']['dbprefix'] = '';
$db['master']['pconnect'] = FALSE;
$db['master']['db_debug'] = TRUE;
$db['master']['cache_on'] = FALSE;
$db['master']['cachedir'] = '';
$db['master']['char_set'] = 'utf8';
$db['master']['dbcollat'] = 'utf8_general_ci';
$db['master']['swap_pre'] = '';
$db['master']['autoinit'] = TRUE;
$db['master']['stricton'] = FALSE;
다음으로 core/My_Model.php 입니다.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
// DB Replacation Model
class MY_Model extends CI_Model {
protected $wdb;
public function __construct()
{
parent::__construct();
$this->load->database();
$this->wdb = $this->load->database('master', TRUE);
}
public function map($fil, $arr)
{
$data = array();
foreach($fil as $name) {
isset($arr[$name]) ? $data[$name] = $arr[$name] : NULL;
}
return $data;
}
}
* MY_Model 안에 있는 map() 함수는 사용자 함수 입니다.
모델 구현시는 아래와 같이 합니다.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Album_model extends MY_Model {
public function __construct()
{
parent::__construct();
}
public function getAll()
{
return $this->db->get('album')->result();
}
public function addAlbum($arr)
{
$ret = FALSE;
$data = $this->map(array('artist', 'title'), $arr);
if(!empty($data)) {
$this->wdb->insert('album', $data);
$ret = $this->wdb->insert_id();
}
return $ret;
}
public function deleteAlbum($id)
{
if(!empty($id)) {
$this->wdb->where(array('id' => $id));
$this->wdb->delete('album');
}
}
public function updateAlbum($arr, $id)
{
$ret = FALSE;
$data = $this->map(array('artist', 'title'), $arr);
if(!empty($id) && !empty($data)) {
$this->wdb->where(array('id' => $id));
$this->wdb->update('album', $data);
$ret = TRUE;
}
return $ret;
}
}
* 무식하지만 차~~암 쉽죠!
테스트용 컨트롤러 입니다.
public function album_test()
{
$this->output->enable_profiler();
$this->load->model('mysql/album_model');
echo "<pre>";
$data = array('artist' => 'hoksi', 'title' => 'aaaa');
$id = $this->album_model->addAlbum($data);
print_r($this->album_model->getall());
$data['title'] = 'bbb';
$this->album_model->updateAlbum($data, $id);
print_r($this->album_model->getall());
$this->album_model->deleteAlbum($id);
print_r($this->album_model->getall());
}
*결과
Array
(
[0] => stdClass Object
(
[id] => 88
[artist] => hoksi
[title] => aaaa
)
)
Array
(
[0] => stdClass Object
(
[id] => 88
[artist] => hoksi
[title] => bbb
)
)
Array()