모델Models
모델은 전통적인 MVC 패턴을 구현하고자하는사람들이 선택적으로 사용할 수 있습니다.
What is a Model?
모델은 데이터베이스와 연동하여 사용하기위한 PHP 클래스입니다. 예를들이, CodeIgniter 를 이용하여 블로그를 관리한다고합시다. 아마 삽입,조회,수정 등의 기능을 가진 모델클래스가 필요할것입니다.
모델클래스의 형태 예제:
class Blogmodel extends CI_Model {
var $title = '';
var $content = '';
var $date = '';
function __construct()
{
// Call the Model constructor
parent::__construct();
}
function get_last_ten_entries()
{
$query = $this->db->get('entries', 10);
return $query->result();
}
function insert_entry()
{
$this->title = $_POST['title']; // please read the below note
$this->content = $_POST['content'];
$this->date = time();
$this->db->insert('entries', $this);
}
function update_entry()
{
$this->title = $_POST['title'];
$this->content = $_POST['content'];
$this->date = time();
$this->db->update('entries', $this, array('id' => $_POST['id']));
}
}
Note: 위의 함수들은 액티브레코드(Active Record) 를 이용하여 데이터베이스를 이용하는 방법을 보여줍니다
Note: 이예제에서는 단순화하기위하여 $_POST 를 바로 사용하였습니다. 일반적으로는 나쁜예죠. 일반적인 접근법은 Input 클래스 를 다음과 같이 사용하는것 입니다 .$this->input->post('title')
모델의 해부
모델클래스는application/models/ 폴더에 저장됩니다. 서브폴더에 저장하셔도 됩니다.
모델클래스의 기본 프로토 타입예:
class Model_name extends CI_Model {
function __construct()
{
parent::__construct();
}
}
Model_name 은 여러분의 클래스 이름으로 바꾸세요. 클래스이름의 첫글자는 반드시 대문자로 시작해야하며 나머지 글자들은 소문자라야 합니다. 여러분의 클래스는 반드시 Model 클래스에서 상속(extends)받아야 합니다.
파일명은 클래스명과 같아야하나 모두 소문자여야 합니다.
예를들어 클래스가 아래와같다면:
class User_model extends CI_Model {
function __construct()
{
parent::__construct();
}
}
파일명은 아래와 같아야합니다:
application/models/user_model.php
모델 로드하기
모델은 일반적으로 컨트롤러 내에서 로드되어 호출됩니다. 모델은 아래와 같은 방법으로 로드합니다:
$this->load->model('Model_name');
모델이 하위폴더에 있다면 상대경로로 모델폴더를 적어줍니다.예를 들어 모델이 application/models/blog/queries.php 경로에 위치해있다면 아래와같이 로드할수 있습니다:
$this->load->model('blog/queries');
모델이 로드되면 모델클래스의 이름과 같은 객체로 모델내의 함수를 사용할수 있습니다.
예제:
$this->load->model('Model_name');
$this->Model_name->function();
모델을 다른객체이름으로 할당하여 사용하고싶다면 두번째 파라미터에 사용하고싶은 이름을 넘겨서 로드하시면됩니다예:
$this->load->model('Model_name', 'fubar');
$this->fubar->function();
아래는 모델을 로드하여 그 데이터를 뷰에 넘겨주는 예제입니다:
class Blog_controller extends CI_Controller {
function blog()
{
$this->load->model('Blog');
$data['query'] = $this->Blog->get_last_ten_entries();
$this->load->view('blog', $data);
}
}
모델 자동로드
프로그램 전체에 걸쳐 글로벌로 모델을 로드해야할경우라면 자동로드 설정을 통해 자동으로 로드하도록 할수 있습니다. application/config/autoload.php 파일을 열어서 autoload 배열에 원하는 모델을 추가하세요.
데이터베이스 연결
모델이 로드되었을때 그 모델이 자동으로 데이터베이스에 연결하지는 않습니다.다음의 옵션을 사용하여 연결하세요.
- 표준 데이터베이스 메소드(상세설명)를 이용하여 컨트롤러나 모델에서 데이터베이스에 연결할수 있습니다.
- 모델을 로드할때 세번째 파라미터를TRUE (boolean)로 설정하여 자동연결할 수 있습니다. 이때 database config 파일에 설정된 정보가 사용될것입니다:
$this->load->model('Model_name', '', TRUE);
- 세번째 파라미터로 데이터베이스 연결정보를 넘겨주어서 연결할 수도 있습니다:
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$this->load->model('Model_name', '', $config);