我目前正在CodeIgniter中创建一个应用程序,我想知道如何处理模型。我现在的设置方式是:
观看次数:显示 控制器:显示相关内容,表单验证,重定向,与图书馆交谈等 库:执行繁重的工作,与模型交谈,生成错误消息,日志等 型号:与DB交谈
(我目前正在使用Active Record进行大多数事情)
让我直接举个例子:
我有一个Auth库,在内部我查询的区域有点相似,只能通过WHERE子句中的值来改变。
例如:
get_by_id($id);
get_by_password_hash($email);
get_by_email($email);
我是否应该拥有一堆这些重复的模型函数,或者我应该只有一个简单的函数,我通过库传递WHERE子句和诸如此类的东西?
例如:
$where = array('id' => $id);
get($where);
如果您希望我澄清一切,请告诉我。 提前谢谢。
答案 0 :(得分:1)
您可以在模型上使用PHP的__call Magic Method来处理任何简单的where子句:
public function __call($method, $parameters)
{
if (strpos($method, 'get_by_') === 0)
{
$this->get(array(substr($method, 7), $parameters[0]));
}
}
答案 1 :(得分:1)
我知道你来自哪里,因为几个月前我有同样的怀疑。
我使用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操作。只需阅读代码,它也可以很好地记录下来。
答案 2 :(得分:1)
如果你有一个给定模型的很多get_by_*
方法,那么使用magicOtwell建议的魔术方法是有意义的。实际上,__call
方法以及__get
和__set
经常在其他框架中使用,以便您可以轻松完成您所说的内容。记住CI在映射时控制器上的__call Magic方法不会很好(但这不会影响模型)。
我在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查询应该几乎完全降级到模型,否则这样做会过于繁琐(但我想知道你是否无法重构)。 / p>