我目前正在用CodeIgniter做一个应用程序,我想知道我应该如何处理模型。我现在设置它的方式是:
视图:显示控制器:显示相关内容、表单验证、重定向、与库对话等库:执行繁重任务、与模型对话、生成错误消息、日志等模型:与数据库对话
(我目前在大多数情况下都在使用活动记录)
让我直接举个例子:
我有一个Auth库,在里面我有一些类似的查询,只是在WHERE子句中的值有所不同。
例如:
get_by_id($id);
get_by_password_hash($email);
get_by_email($email);我应该有一堆重复的模型函数,还是应该只有一个简单的函数,我通过库传递where子句之类的东西?
例如:
$where = array('id' => $id);
get($where);如果你想让我澄清什么,请告诉我。提前谢谢。
发布于 2011-07-26 03:47:26
如果您对给定的模型有很多get_by_*方法,那么按照TaylorOtwell的建议使用神奇的方法是有意义的。实际上,在其他框架中经常使用__call方法以及__get和__set,这样就可以很容易地完成您所说的事情。只需记住,在映射时,CI不会很好地使用控制器上的__call魔术方法(但这不会影响模型)。
我在CI中看待CMV的基本方式:
通常,控制器会做这样的事情:
class Users
{
function display( $id )
{
$this->load->library( 'myformatlib' );
$this->load->model( 'mymodel' );
$data = $this->mymodel->get_user( $id );
$formatted = $this->myformatlib->addColors( $data );
$this->mymodel->incrementViews( $id );
$this->load->view( 'full_user', $formatted );
}
}至于传递where子句-- DB查询几乎应该完全归于模型,除非没有其他选择,或者这样做太麻烦了(但我想知道您是否不能重构它)。
发布于 2011-07-25 23:30:58
您可以在模型上使用PHP的__call Magic Method来处理任何简单的where子句:
public function __call($method, $parameters)
{
if (strpos($method, 'get_by_') === 0)
{
$this->get(array(substr($method, 7), $parameters[0]));
}
}发布于 2011-07-26 03:32:36
我很清楚你是从哪里来的,因为几个月前我也有同样的疑虑。
我使用https://bitbucket.org/philsturgeon/codeigniter-base-model/src/93a643d0d46f/MY_Model.php
把它当做一个库就行了。将模型创建为
// user_m.php
<?php (defined('BASEPATH')) OR exit('No direct script access allowed');
class User_m extends MY_Model
{}除了基本的CRUD函数之外,上面的函数还可以包含您想要的任何自定义函数。
在控制器中运行代码的方式为
$this->load->model('user_m');
$this->data['user'] = $this->user_m->get($user_id);或
$this->load->model('user_m');
$this->data['user'] = $this->user_m->get_by(array('something_id' => $something));它有你需要的所有基本的CRUD操作。只需阅读代码,它也有很好的文档记录。
https://stackoverflow.com/questions/6818447
复制相似问题