访问其他模型中的代码标记器模型

2022-08-30 12:19:18

过去,在CodeIgniter模型中,您无法访问另一个模型。

$this->load->model('bar');
$this->bar->something();

这是否仍然有效,或者他们已经改变了它?


答案 1

这些是一个简单问题的一些很长的答案。

简短的回答:现在完全支持此功能。交叉加载离开,如果你喜欢它!


答案 2

我强烈反对“模型”只应使用简单的 CRUD 操作封装数据库表的概念。正如维基百科文章中所指出的:

http://en.wikipedia.org/wiki/Model-view-controller#As_a_design_pattern

...该应用层旨在执行更多操作,而不仅仅是充当单个数据库表抽象。想想“控制器”这个词的含义 - 它应该更多地充当控制器,而不是作为整个应用程序本身。“模型”业务逻辑的一个位置。实际上,大多数大规模应用程序将其大部分业务逻辑保存在数据库本身中(以触发器、存储过程、外键等形式)。

我认为对“模型”是什么的误解部分是由“MVC”的相同(过度)炒作引起的,而没有对概念本身进行太多理解。有点像“AJAX”是多么空洞,或者更简单,“Web 2.0”。无论好坏,许多脚本小子们都跳上了MVC的马车,并且由于简单的操作方法和示例场景除了告诉您将数据库代码放在“模型”中之外并没有做更多的事情,因此将该层误用为仅数据库抽象已经变得司空见惯。现在你在互联网上读到一些帖子,称它为“不纯”,“肮脏”,“黑客”,以将任何业务逻辑放入模型中。这是错误的。误导。

简单的例子是考虑外键:即使你只想让你的“模型”是一个数据库模型,如果你想成为“纯”,“正确”或者你有什么,你真的应该在其中强制执行引用完整性。由于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;
   }

推荐