所以我在CodeIgniter中的扩展模型(MY_Model)中有这段代码:
function get($options = array(), $selects = array(), $joins = array(), $table, $object = TRUE)
{
if(!empty($options))
{
foreach($options as $option => $array)
{
foreach($array as $column => $value)
{
$this->db->{$option}($column, $value);
}
}
}
if(!empty($select))
{
foreach($selects as $select)
{
$this->db->select($select);
}
}
if(!empty($joins))
{
foreach($joins as $join => $array)
{
foreach($array as $jointable => $column)
{
$this->db->join($join, $join.'.'.$column.'='.$jointable.'.'.$column);
}
}
}
$query = $this->db->get($table);
return $query->result();
}
我可以在下面传递数组:
$options = array(
'where' => array(
'companys.companyID' => $companyID
)
);
$select = array(
'companyID',
'companyName'
);
$join = array(
'persons' => array(
'companys' => 'companyID'
)
);
$result = $this->companyModel->get($options, $select, $join, 'companys');
print_r('<pre>');
print_r($result);
我的问题是,这是不是一个好主意的原因。我在我自己的MY_Model中扩展了默认的CI_Model,然后所有其他模型都可以使用此get,并且仍然拥有自己的函数。我有其他基本CRUD操作的类似功能。
另一种方式是,在模型中分离功能以完成大部分工作,并使最小的控制器成为最佳路径。即使这意味着你在所有模型中编写相同的代码块?
希望这不是一个愚蠢的问题,或者我误解了MVC的核心内容,但无论如何都要感谢回复。
答案 0 :(得分:0)
欢迎大量开发人员尝试抽象sql。 ;)
数据库抽象是Web应用程序中的核心概念,但绝不是MVC模式的一部分,因为模型只是被描述为应该反映您的域的数据和方法的集合。实际上,这通常意味着有商业方法和回调可以做到这一点。您如何保留数据取决于您自己。让你了解应该做什么的示例模式是here。另外看看在版本1.x中使用ActiveRecord的Doctrine,最近在版本2.0中更改了这个更简单Entity-Pattern的factorys。
你的方法对我来说很好看。但是有一个警告:不要弯腰太多。如果您正在编写应用程序而不是框架,那么您可以自由地将您的域名包含在业务中,也可以用于技术方面。如果您发现自己处理的是此方法无法实现的查询,请不要更改方法,只需使用真实的查询。