过去,在CodeIgniter模型中,您无法访问其他模型.
$this->load->model('bar');
$this->bar->something();
Run Code Online (Sandbox Code Playgroud)
这仍然有效,还是他们改变了?
Phi*_*eon 69
对于一个简单的问题,这些是非常长的答案.
简短回答:现在完全支持.如果您愿意,可以交叉装载!
小智 39
我非常不同意"模型"应该只使用简单的CRUD操作封装数据库表的概念.如维基百科文章所述:
http://en.wikipedia.org/wiki/Model-view-controller#As_a_design_pattern
...应用程序层的目的不仅仅是作为单个数据库表抽象.想想"控制器"这个词的含义 - 它应该更像是一个导演,而不是整个应用程序本身."模型" 是业务逻辑的场所.事实上,大多数大规模应用程序在数据库本身中都有很多业务逻辑(以触发器,存储过程,外键等形式).
我认为对"模型"的误解部分是由于"MVC"的相同(过度)炒作造成的,而没有对概念本身进行过多的理解.有点像空的"AJAX",甚至更简单,"Web 2.0".无论好坏,大量的脚本小子都跳上了MVC旅行车,因为简单的howtos和示例场景所做的不仅仅是告诉你把你的数据库代码放在"模型"中,而是滥用那个层只有数据库抽象已经司空见惯.现在,您阅读了互联网上的帖子,称其为"无法","脏","黑客"将任何业务逻辑放入模型中.那是错的.误导.
简单的例子是考虑外键:即使你只想让你的"模型"成为数据库模型,如果你想要"纯粹","正确"或者你有什么,你真的应该在其中强制执行参照完整性.多亏了MySQL多年来缺乏真正的外键支持,Web应用程序的成长使得任何人都不必担心引用完整性.适合脚本小子生活方式我想.无论如何,即使这个简化的模型视图能够维护外键的有效性,模型也必须与其他人一起工作(或者,特别是如果像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;
}
Run Code Online (Sandbox Code Playgroud)
它可能,但不是理想的,被认为是坏的,更多的是"快速修复"而非理想或纯粹的实现.
class Location extends Model{
public function get($ID){
// Get main CI object handle and load model
$CI =& get_instance();
$CI->load->model('LocationType');
// Call new model functions using handle to main CI object
$CI->LocationType->setID($result->LocationTypeID);
$CI->LocationType->setTitle($result->TypeTitle);
$this->_locationType = $CI->LocationType;
//Other Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
任何时候你使用这样的主CI对象可能是一个坏主意.尝试重新考虑您的布局,只需将数据传入控制器或从控制器传递到模型.
http://codeigniter.com/forums/viewthread/69833/
您可以像Phil Sturgeon所说的那样从模型中加载模型,但是如果在模型构造函数中加载模型,则必须小心依赖关系:如果模型A使用模型B而模型B使用模型A,则当您尝试加载模型或模型时另外,你会进入无限循环.