В тех случаях когда нужен полноценный орм, рекомендую воспользоватся Doctrine, благо с Codeigniter'ом она очень хорошо интегрируется.
Но бывает, что так много возможностей не нужно, а прописывать CRUD к каждой таблице долго и утомительно.
Очевидное решение рассширить модель.
Итак создаём файл MY_model.php(/system/application/libraries/MY_model.php)
В файле autoload.php (/system/application/config/autoload.php)
пишем загружаем необходимые классы
<сode>
$autoload['libraries'] = array('database','model','MY_model');
Приготовления законченны.
теперь надо бы это дело как-то использовать.
допустим у нас мы создаём таблицу где мы собираемся хранить адреса e-mail со следующей структурой:
создаём модель:
Всё больше ничего писать не надо, можно сразу начать пользовать
Вот как применение будет выглядет создание новой записи в контроллере:
Вот собственно и всё. Решение не претендует на универсальность, однако в некоторых случаях может облегчить жизнь
Но бывает, что так много возможностей не нужно, а прописывать CRUD к каждой таблице долго и утомительно.
Очевидное решение рассширить модель.
Итак создаём файл MY_model.php(/system/application/libraries/MY_model.php)
<? php
class MY_model extends model{
private $key_field = null;
private $table = null;
private $params = array();
private $item = array();
public function MY_model($table = null){
parent::model();
if($table != null){
$this->setFields($table);
}
}
public function setFields($table, $key_field){
$fields = $this->db->list_fields($table);
foreach ($fields as $field)
{
$table_fields[] = $field;
}
$this->params = $table_fields;
$this->table = $table;
$this->key_field = $key_field;
}
public function getItem(array $searchValues){
foreach($searchValues as $key => $value){
if(!in_array($key,$this->params)){
show_error('wrong searchValues');
die();
}
}
$query = $this->db->get_where($this->table, $searchValues, 1);
if($query->num_rows() < 1){
show_error('can\'t find entry ');
die();
}
else if($query->num_rows() > 1){
show_error('found multiply entries');
die();
}
else{
foreach($query->result_array() as $row){
$this->item = $row;
}
}
}
public function editItem(array $editValues){
if($this->item === array()){
show_error('no item to edit');
die();
}
else{
foreach($editValues as $key => $value){
if(!in_array($key,$this->params)){
show_error('wrong editValues');
die();
}
}
foreach($editValues as $key => $value){
$this->item[$key] = $value;
}
}
}
public function saveItem(){
if($this->item === array()){
show_error('no item to save');
die();
}
if($this->key_field == null){
show_error('no key_field defined');
die();
}
if(array_key_exists($this->key_field,$this->item) && $this->item != array()){
$this->db->where($this->key_field, $this->item[$this->key_field]);
$this->db->update($this->table, $this->item);
}
else{
$this->db->insert($this->table, $this->item);
}
}
public function deleteItem(){
if($this->item === array()){
show_error('no item to delete');
die();
}
if($this->key_field == null){
show_error('no key_field defined');
die();
}
if(array_key_exists($this->key_field,$this->item) && $this->key_field != null){
$this->db->delete($this->table, array( $this->key_field => $this->item[$this->key_field]));
}
else{
show_error('no id set to delete an entry');
die();
}
}
public function newItem(array $newValues){
foreach($newValues as $key => $value){
if(!in_array($key,$this->params)){
show_error('wrong newValues');
die();
}
}
$this->item = $newValues;
}
public function cleanItem(){
$this->item = array();
}
}
* This source code was highlighted with Source Code Highlighter.
В файле autoload.php (/system/application/config/autoload.php)
пишем загружаем необходимые классы
<сode>
$autoload['libraries'] = array('database','model','MY_model');
Приготовления законченны.
теперь надо бы это дело как-то использовать.
допустим у нас мы создаём таблицу где мы собираемся хранить адреса e-mail со следующей структурой:
CREATE TABLE `email_list` (
`id` int(11) NOT NULL auto_increment,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;* This source code was highlighted with Source Code Highlighter.
создаём модель:
<? php
class Email_model extends MY_Model
{
function Email_model(){
parent::MY_Model();
}
}
* This source code was highlighted with Source Code Highlighter.
Всё больше ничего писать не надо, можно сразу начать пользовать
Вот как применение будет выглядет создание новой записи в контроллере:
<? php
class Email extends Controller {
function Email(){
parent::Controller;
// Загружаем модель для доступа во всех методах контроллера
$this->load->model('Email_model');
// имя таблицы и ключ
$this->Email_model->setFields('email_list','id');
}
function index()
{
// создаём новую запись
$this->Email_model->newItem(array('email' => 'someemail@somedomain.com'));
// сохраняем запись
$this->Email_model->saveItem();
// очищаем запись
$this->Email_model->cleanItem();
// находим запись по полю по значению поля email
$this->Email_model->getItem(array('email' => 'someemail@somedomain.com'));
// редактируем её
$this->Email_model->editItem(array('email' => 'someotheremail@somedomain.com'));
// сохраняем запись
$this->Email_model->saveItem();
// стираем запись
$this->Email_model->deleteItem();
// очищаем запись
$this->Email_model->cleanItem();
}* This source code was highlighted with Source Code Highlighter.
Вот собственно и всё. Решение не претендует на универсальность, однако в некоторых случаях может облегчить жизнь