Использование моделей в CodeIgniter - PullRequest
4 голосов
/ 12 июля 2010

Может кто-нибудь объяснить мне, когда это хорошая практика - использовать модели в КИ? В статье в Википедии упоминались модели CI как «полностью необязательные и редко требующиеся», так ли это в любом случае?

Ответы [ 7 ]

16 голосов
/ 12 июля 2010

Скажем, вам нужно вызвать функцию с именем get_user_info, которая извлекает информацию о пользователях из базы данных. Вы могли бы иметь такую ​​функцию:

class Home extends Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $user = $this->get_user_info($_SESSION['user_id']);
        echo "Hello " . $user['first_name'];
    }

    function get_user_info($user_id) {
        $query = $this->db->query("SELECT * FROM users WHERE user_id = ?", array($user_id));
        return $query->row_array();
    }
}

Однако, что если вам нужно позвонить get_user_info на другую страницу?

В этом сценарии вам придется копировать и вставлять функцию на каждую страницу, что затрудняет обслуживание, если у вас много страниц (что если вам нужно изменить запрос на JOIN для другой таблицы?)

Это также противоречит принципу не повторяйся .

Модели предназначены для обработки всей логики и представления данных, возвращая данные, уже загруженные в представления. Чаще всего они используются для группировки функций базы данных, что упрощает их изменение без изменения всех ваших контроллеров.

class User extends Model {

    function __construct() {
        parent::Model();
    }

    function get_user_info($user_id) {
        $query = $this->db->query("SELECT * FROM users WHERE user_id = ?", array($user_id));
        return $query->row_array();
    }

}

Выше мы создали модель под названием user. В нашем домашнем контроллере теперь мы можем изменить код так:

class Home extends Controller {

    function __construct() {
        parent::__construct();
    }

    function index() {
        $this->load->model('user');
        $user = $this->user->get_user_info($_SESSION['user_id']);
        echo "Hello " . $user['first_name'];
    }
}

И теперь вы можете изменить свою функцию get_user_info, не меняя число контроллеров X, которые полагаются на одну и ту же функцию.

2 голосов
/ 12 июля 2010

Нет !! Это не правда. Модели используются как слой между вашим контроллером и базой данных. Лучшая практика MVC в лучшем случае субъективна. Люди используют это по-разному. Фреймворк, такой как CodeIgniter, хорош, потому что он обеспечивает такой уровень гибкости. Другие рамки гораздо более строгие. В общем, я стараюсь держать свои контроллеры очень маленькими и конкретными и помещать в модель много кода (взаимодействие с БД, результаты анализа и т. Д.)

1 голос
/ 26 января 2013

Существует принцип, называемый «толстая модель / тощий контроллер», на который вы могли бы взглянуть, который предполагает, что вес вашей обработки должен быть сделан в файлах модели в отличие от контроллеров.Это подтверждает принцип «не повторяй себя», как описано выше в @fire, а также способствует повторному использованию.

Я обнаружил, что с помощью этого принципа я получил набор общих, многократно используемыхконтроллеры, каждый из которых использует набор многократно используемых моделей, а иногда и специфичные для проекта контроллеры, используемые только один раз для сайта.Помимо этого, у меня есть взаимозависимость между моделями.Я не смог бы использовать его так часто, как если бы я не следовал вышеупомянутому принципу и не включал в модели столько обработки, сколько смогу.

Эта тема часто обсуждается в Интернете, поэтому естьмного информации, чтобы посмотреть, но кажется, что на платах Code Igniter это рекомендуется более опытными пользователями.

Я должен добавить, что «совершенно необязательно и редко требуется», как правило, не так, ясказал бы, что это совершенно неправильно во всем, кроме самых простых случаев - самые простые случаи - это статические страницы, которые не интегрируются с базой данных и просто состоят из нескольких загруженных представлений, но даже тогда используют модель с функцией дляЖелательно получить общий набор представлений для каждой страницы.

1 голос
/ 12 июля 2010

Вы должны использовать модели, чтобы избежать дублирования кода (не повторяйте себя).Я думаю, что большинство (почти все) приложения, созданные с помощью codeigniter, будут использовать модели какого-то рода.

Возможно, статья ссылается на класс активных записей, который необязательно использовать в моделях.Активная запись, которую я нахожу подходящей для создания, обновления и удаления, но вам, скорее всего, понадобится sql для любых немного сложных операций чтения.Стоит отметить, что в моделях можно использовать не только базы данных.Веб-сервисы или простые файлы или любой другой источник данных может использоваться в модели.

Я думал о моделях только как о уровне базы данных.Их не должно быть, это создает вздутие живота в ваших контроллерах.Использование fat-контроллеров в конце замедлит вас.Поместите всю модель в модель, если можете, и просто используйте контроллер для логики.

1 голос
/ 12 июля 2010

Ну, «модель» представляет данные, скорее всего, из базы данных (то есть ваши строки возвращаются из базы данных, а модель содержит отправленные данные, проще говоря). Нет необходимости использовать уровень базы данных, заданный CI - это правда - вы можете заменить его на другой, если хотите, но то, что они «редко используются», просто не соответствует действительности.

0 голосов
/ 06 августа 2014

Эта моя модель Large имеет множество методов.

    class Shortcode_model extends CI_Model {

        public function __construct() {
            parent::__construct();
            $this -> load -> library('session');
        }

        /**
         * Misc functions
         */

        /**
         * read keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function read($id) {
            $this -> db -> select();
            $this -> db -> from('short_code');
            $this -> db -> where('id', $id);

            $query = $this -> db -> get();

            $result = $query -> row();

            $shortcode = new stdClass();

            $shortcode->id                  = $result->id;
            $shortcode->code                = $result->code;
            $shortcode->aggregator          = $result->aggregator;
            $shortcode->mo_pp_id            = $result->mo_pp_id;
            $shortcode->mt_free_pp_id       = $result->mt_free_pp_id;
            $shortcode->mt_bill_pp_id       = $result->mt_bill_pp_id;
            $shortcode->partner_role_id     = $result->partner_role_id;
            $shortcode->partner_role_pass   = $result->partner_role_pass;
            $shortcode->product_id          = $result->product_id;
            $shortcode->billable            = $result->billable;
            // $shortcode->created              = $result->created;
            // $shortcode->changed              = $result->changed;
            $shortcode->status              = $result->status;

            //print_r($shortcode);
            return $shortcode;

        }

        public function read_operator($telco_id){


            $this -> db -> select();
            $this -> db -> from('operator');
            $this -> db -> where('telco_id', $telco_id);

            $query = $this -> db -> get();

            $result = $query -> row();

            $operator = new stdClass();

            $operator->id               = $result->id;
            $operator->code             = $result->telco_id;
            $operator->name             = $result->telco_name;

            return $operator;


        }

        /**
         * create keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function create($arr_data) {
            $this -> db -> insert('short_code', $arr_data);
            //$stock['stock_id'] = $this->db->insert_id();

            //return $query->result();

            //return $keywords;

        }

        /**
         * update keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function update($arr_data) {
            $this -> db -> where('id', $arr_data['id']);
            $this -> db -> update('short_code', $arr_data);

        }

        /**
         * delete keyword .
         *
         * @return void
         * @author Chinthaka
         **/
        public function delete($id) {
            $this -> db -> where('id', $id);
            $this -> db -> delete('short_code');

        }

        /**
         * get all enabled shortcodes stored in the database.
         *
         * @return $shortcodess
         * @author Chinthaka
         **/
        public function all_enable_shortcodes() {
            $this -> db -> select();
            $this -> db -> from('short_code');
            $this -> db -> where('status', 'enable');
            $this -> db -> order_by("code");

            $query = $this -> db -> get();

            $result = $query -> result_array();

            //echo mysql_num_rows($result);

            $shortcodes = array();

            foreach ($result as $row) {
                $shortcode = $this -> read($row['id']);
                array_push($shortcodes, $shortcode);
            }

            /*while($data = $this->db->call_function('fetch_row', $result )) {
             $shortcode =   $this->read($data['id']);
             array_push($shortcodes,$shortcode);
             }*/

            return $shortcodes;

        }

        /**
         * check shortcode is exist.
         *
         * @return boolean
         * @author Chinthaka
         **/
        function is_exists($shortcode, $id = 0) {

            $this -> db -> where('code', $shortcode);

            if ($id > 0) {
                $this -> db -> where('id <>', $id);
            }

            $query = $this -> db -> get('short_code');

            if ($query -> num_rows() > 0) {
                return true;
            } else {
                return false;
            }
        }

        public function get($short_code_id)
        {
            $query = $this->db->query('select * from short_code where id=?', array($short_code_id));
            log_message('debug', $this->db->last_query());
            return $query->row();
        }

    }
0 голосов
/ 12 июля 2010

Модели предназначены для бизнес-логики (в идеальных случаях ... может быть для дебатов, некоторые люди помещают логику в контроллер) и для подключения к БД в инфраструктуре MVC.

Прочтите руководство пользователя codeigniter для получения дополнительной информации о моделях.

http://codeigniter.com/user_guide/general/models.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...