В 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=>&$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);
Можно, вообще избавиться от ограничений по именованию классов и переписать все функции, для приема имени таблицы в качестве параметра. Но, это дело вкуса. Как по мне, то проще соблюсти несложные правила.