Удобное расширение модели CodeIgniter

В system/application/models создаем файл base_model.php. В этом файле и будет описан наш класс, который расширяет основную модель фреймворка:
<?php

class Base_model extends Model {
    protected $table;
    protected static $count; //общее число записей (для пейджинации)

    function Base_model() {
        parent::Model();
        // Вырезаем из имени класса модели окончание "_model"
        //(Например, из User_model получаем User)
        $model_class_name = strtolower(get_class($this));
        $this->table = substr_replace($model_class_name,"",
                                   strpos($model_class_name,"_model"),6);
    }

    function get_all($limit='', $offset='', $order_by='') {
        $this->db->select('*');
        $this->db->from($this->table);
        if ($order_by)
            $this->db->order_by($order_by);
        self::$count = $this->db->count_all_results('', true);
        $this->apply_pagination_settings($limit, $offset);
        return $this->db->get()->result();
    }

    function apply_pagination_settings($limit, $offset) {
        if ($limit and $offset) {
            $this->db->limit($limit, $offset);
        }
        elseif ($limit) {
            $this->db->limit($limit);
        }
        return;
    }

    function count_all() {
        if (self::$count) {
            return self::$count;
        }
        return $this->db->count_all($this->table);
    }

    function find($where, $order_by='') {
        $this->db->select('*');
        $this->db->from($this->table);
        $this->db->where($where);
        if ($order_by != '') {
            $this->db->order_by($order_by);
        }
        $result = $this->db->get()->result();
        return $result;
     }

     function get_by_id($id) {
          $this->db->select('*');
          $this->db->from($this->table);
          $this->db->where('id', $id);
          $res = $this->db->get()->result();
          if (count($res) > 0)
              return $res[0];
          return null;
     }

    function save($id, $data) {
        if ($id) {
            foreach($data as $key=>&amp;$item)
            {
                 if($item===''){unset($data[$key]);}
            }
            $this->db->where('id', $id);
            $this->db->update($this->table, $data);
        }
        else {
            $this->db->insert($this->table, $data);
        }
    }

    function delete($id) {
        $this->db->delete($this->table, array('id' => $id));
    }

}

?>

Все остальные наши модели объявляем уже как расширения нашей base_model.
Например, создадим модель user_model. В файле user_model.php размещаем такой код:
<?php
class User_model extends Base_model {
}
?>

Наша новая модель унаследовала весь функционал base_model. Т.е. она может выбирать данные из таблицы user, вставлять, обновлять, удалять, считать количество записей:
<?php
class Main extends Controller {

    function index(){
        $this->load->model('base_model');
        $this->load->model('user_model');
        //выборка всех пользователе
        $users = $this->user_model->get_all();
        //добавление нового пользователя
        $data = array('username' => 'Petr',
                     'surname'  => 'Ivanov',
                     'email'      => 'ivanov.petr@gmail.com' );
        $this->user_model->save('',$data);
        // допустим данный id существует в таблице user
        $id = 15;
        // обновление данных (update) для id=15
        $this->user_model->save($id, $data);
        // удаление записи с id=15
        $this->user_model->delete($id);
    }
}
?>

<?php
class Main extends Controller {
 
    function index(){
        $this->load->model('base_model');
        $this->load->model('user_model');
        //выборка всех пользователе
        $users = $this->user_model->get_all();
        //добавление нового пользователя
        $data = array('username' => 'Petr',
                     'surname'  => 'Ivanov',
                     'email'      => 'ivanov.petr@gmail.com' );
        $this->user_model->save('',$data);
        // допустим данный id существует в таблице user
        $id = 15;
        // обновление данных (update) для id=15
        $this->user_model->save($id, $data);
        // удаление записи с id=15
        $this->user_model->delete($id);
    }
}
?>

Для работы данного кода необходимо соблюдать два правила:
1. Все таблицы БД должны содержать поле id.
(`id` int(11) NOT NULL auto_increment )
2. Классы моделей должны называться по следующему правилу Tablename_model.

Второе правило можно изменить под свои привычки, тогда нужно будет внести соответствующие корректировки в эти две строчки кода (в конструкторе base_model):
$model_class_name = strtolower(get_class($this));
$this->table = substr_replace($model_class_name,"",
                           strpos($model_class_name,"_model"),6);

Можно, вообще избавиться от ограничений по именованию классов и переписать все функции, для приема имени таблицы в качестве параметра. Но, это дело вкуса. Как по мне, то проще соблюсти несложные правила.
Теги:
модель
Добавлено: 29 Июня 2018 07:17:37 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...