Programming/PHP

[기초정리 잘 됨] [PHP] Codeigniter (코드이그나이터) Model

로샤스 2017. 7. 21. 05:32

CI의 Model에 대해서 정리합니다.


MVC 디자인 패턴에서 M인 Model은 데이터를 담당합니다. 

데이터란 보통 데이터베이스를 말하고 있습니다.

데이터를 다루는 로직을 따로 모델로 모아두어 데이터의 입출력과 화면을 관리하는 뷰를 격리 시켜

좀 더 편리하게 작업할 수 있는 환경을 그리고 호환성있게 만들어줄수 있습니다.



1. 데이터베이스 설정


Model을 사용하기 위해 CI의 데이터베이스 설정입니다.

Application/config/database.php 파일을 수정해야합니다.

주요 내요한 몇가지 설정만 해주시면 됩니다.


hostname : 데이터베이스 서버의 주소

username : 데이터베이스 사용자의 이름

password : 데이터베이스 비밀번호

database : 데이터베이스 명

dbdriver : 데이터베이스의 종류로 지원되는 드라이브의 목록은 system/database/drivers 디렉토리명을 참고한다.


※주의사항

데이터베이스 설정 파일에는 데이터베이스 서버에 접속 할 수 있는 정보를 그대로 입력하기 때문에

노출되서는 안됩니다. 따라서 버전관리를 사용하실때에는 제외해야합니다.



2. 데이터베이스 라이브러리 로드


CI에서 데이터베이스를 사용하기 위해서는 먼저 데이터베이스 라이브러리를 로드해야합니다.

CI에서는 2가지 방법을 제공해주고 있습니다.


1. application/config/autoload.php 파일의 $autoload['libraries'] 배열에 'database'를 추가한다. 

2. controller 내에서 $this->load->database()를 호출한다.


※저는 2번째 방법으로 진행했습니다.



3. 모델 파일 생성


Model 파일은 Application/models 디렉토리 아래에 '모델명_model.php'의 형식으로 파일을 생성해주면 됩니다. Model 파일은 CI_Model을 상속받아야 합니다. 또한 클래스 명은 '모델명_model' 이어야 하며 첫글자는 대문자로 하셔야 합니다.


단순한 쿼리를 사용하기위해서는 아래와 같이 합니다.


$this->db->query("SELECT * FROM test");



쿼리의 결과를 가져오려면 아래와 같이 하시면 됩니다.


$this->db->query("SELECT * FROM test")->result();



result()는 쿼리의 결과를 가져오는 방법입니다.

연관배열의 형태로 결과를 가져오는 방법은 result_array()의 형태입니다.

결과가 한 행이라면 row()를 사용하셔도 좋습니다.



또한 CI에서는 Active Record라는 기능을 제공해줍니다.

Active Record는 좀 더 프로그래밍적으로 데이터베이스를 제어하는 방법으로

Active Record를 이용하면 표준 SQL을 생성 할 수 있어서 이식성이 좋아집니다.





4.모델 사용


Model를 이용해 데이터를 조작하는 로직을 메소드로 정의하고

메소드는 Controller를 통해서 사용하면 됩니다.


모델을 사용하기 위해서는 먼저 모델을 로드합니다.


$this->load->model('모델파일이름');



모델의 메소드 호출하는 방법


$test_list = $this->test_model->gets();




-예제-


지난 포스팅에 했던 view에서 모델을 추가하여 작업하였습니다.


모델을 테스트하기 위해 다음과 같은 형식의 데이터베이스의 테이블을 생성했습니다.


1
2
3
4
5
create table test(
seq int not null primary key,
title varchar(255) not null,
contents text not null,
regdate datetime not null);



Application/controllers/test.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Test extends CI_Controller {
 
    public function __construct()
    {
        parent::__construct();
        $this->load->database();
        $this->load->model('test_model');
    }
 
    public function index()
    {
        $this->load->view('header');
        $test_list = $this->test_model->gets();
        $this->load->view('test_list',array('test_list'=>$test_list));
        $this->load->view('test');
        $this->load->view('footer');
 
    }
 
    public function Some($parameter)
    {
        $this->load->view('header');
        $test_list = $this->test_model->gets();
        $this->load->view('test_list',array('test_list'=>$test_list));
 
        $test_item = $this->test_model->get2($parameter);
        $this->load->view('some',array('test_item'=>$test_item));
 
        $this->load->view('footer');
    }
 
}
?>


Application/models/test_model.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
class Test_model extends CI_Model{
 
    function __construct()
    {
        parent::__construct();
    }
 
    function gets(){
        $strQuery = "SELECT * FROM test";
 
        return $this->db->query($strQuery)->result();
    }
 
    function get1($seq){
        $strQuery = "SELECT * FROM test where seq = " . $seq;
 
        return $this->db->query($strQuery)->result();
    }
 
    function get2($seq){
 
        return $this->db->get_where('test',array('seq'=>$seq))->row();
    }
 
}
?>

Application/views/.php


1
2
3
4
5
6
<article>
    <h1><?=$test_item->title?></h1>
    <div>
        <h2><?=$test_item->contents?></h2>
    </div>
</article>


Application/views/test_list.php


1
2
3
4
5
6
7
8
9
<ul>
<?php
foreach($test_list as $entry){
?>
    <li><a href="/Study/index.php/test/some/<?=$entry->seq?>"><?=$entry->title?></a></li>
<?php
}
?>
</ul>



위 예제를 접속하면 다음과 같이 나옵니다.



아래는 데스트2의 타이틀을 클릭했을때 나오는 화면입니다.



데이터베이스에 들어가 있는 내용이 잘 나오는 것을 확인 할 수 있습니다.




※참고자료


Opentutorial - 생활코딩 Controller 편 : http://opentutorials.org/module/327/3827

Codeigniter Manual : http://codeigniter-kr.org/user_guide_2.1.0/general/models.html


#제 블로그 보다 Opentutoril의 생활코딩에 올라온 자료가 더 좋습니다.

공부하면서 정리하는 내용입니다.



-







Reference: http://yoshikixdrum.tistory.com/162