Я категорически не согласен с тем, что «модель» должна инкапсулировать таблицу базы данных только с простыми операциями CRUD. Как отмечено в статье в Википедии:
http://en.wikipedia.org/wiki/Model-view-controller#As_a_design_pattern
... этот прикладной уровень призван сделать больше, чем просто действовать как абстракция таблицы единой базы данных. Подумайте о значении слова «контроллер» - оно должно действовать скорее как директор, а не как само приложение. «Модель» - это место для бизнес-логики. Большинство крупномасштабных приложений фактически хранят большую часть своей бизнес-логики в самой базе данных (в форме триггеров, хранимых процедур, внешних ключей и т. Д.).
Я думаю, что неправильное понимание того, что такое «модель», отчасти вызвано той же (чрезмерной) шумихой «MVC», не имея при этом особого понимания самих концепций. Вроде как, насколько пустой «AJAX» или, еще проще, «Web 2.0». К счастью или к сожалению, на повозке MVC запрыгнуло множество детишек сценариев, и поскольку простые сценарии с практическими рекомендациями и примерами делают не больше, чем просто совет поместить код вашей базы данных в «модель», злоупотребление этим слоем как только абстракция базы данных стала обычным явлением. Теперь вы читаете сообщения по всему Интернету, называя их «нечистыми», «грязными», «хакерскими», чтобы поместить любую бизнес-логику в модель. Это неверно. Дезинформировали.
Простой пример - подумать о внешних ключах: даже если вы хотите, чтобы ваша "модель" была моделью базы данных , если вы хотите быть "чистой", "правильной" или чем-то еще вы действительно должны обеспечивать ссылочную целостность в нем. Благодаря отсутствию реальной поддержки внешнего ключа в MySQL в течение многих лет веб-приложения росли, и никто не беспокоился о ссылочной целостности вообще. Подходит для сценария детского образа жизни, я думаю. В любом случае, даже для того, чтобы даже этот упрощенный вид модели мог поддерживать достоверность внешнего ключа, модель должна работать с другими (или, особенно, если такая среда, как CodeIgniter, не позволяет вам этого делать, вы должны писать запросы другим таблицы, иногда дублирующие запросы в другом месте - ЭТО плохой стиль).
Поэтому я считаю, что это недостаток CodeIgniter. Я понимаю, что это может быть нелегко, но это, безусловно, разочаровывающий упущение.
Итак, я взял приведенный выше пример кода и превратил его в помощника, так что теперь у меня есть функция, которая работает почти идентично обычной функциональности $ this-> load-> model (). Вот оно (поместите его в помощник, который загружается автоматически, и вы можете использовать его в любой модели):
/**
*
* Allow models to use other models
*
* This is a substitute for the inability to load models
* inside of other models in CodeIgniter. Call it like
* this:
*
* $salaries = model_load_model('salary');
* ...
* $salary = $salaries->get_salary($employee_id);
*
* @param string $model_name The name of the model that is to be loaded
*
* @return object The requested model object
*
*/
function model_load_model($model_name)
{
$CI =& get_instance();
$CI->load->model($model_name);
return $CI->$model_name;
}