无法从codeigniter 3.0.5中的控制器调用模型中的方法

时间:2016-04-20 15:31:23

标签: php codeigniter-3

我正在使用 CodeIgniter 3.0.5 ,我已经做了相当多的研究,以找到解决我相对简单的问题的解决方案。

看看我的情况。

我有一个文件名为Technology_model.php

的模型
<?php 
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    class Technology_Model extends CI_Model
    {
        function __construct()
        {
            parent::__construct();
        }          

        public function getData()
        {
             $query = $this->db->get('technology');
             return $query->result();
        }
    }
?>

我已将此模型加载到我的控制器文件Technology.php中,并且我正在尝试访问模型中的方法。

<?php   
defined('BASEPATH') OR exit('No direct script access allowed');

class Technology extends CI_Controller 
{

    // *******Constructor*******
    function __construct()
    {
         parent::__construct();            
    }
    // *******Constructor*******

    public function index() 
    {
         $this->load->model('Technology_Model');
         //Model loads fine..checked

         $data['records'] = 
            $this->Technology_model->getData(); //*** <=ERROR in this line
    }
}
?>

我找到的解决方案都是关于更改以下字符大小写的内容:

  1. Model类的名称,
  2. 模型文件名,
  3. 在控制器中调用时的模型名称,
  4. 加载后调用方法时模型的名称
  5. 我已经尝试了所有的命名约定。该模型正在加载。但是当我尝试调用模型中的方法时,会出现以下错误。

    有人说它是CI 3.0.5中的一个Bug。我已经在autoload.php中配置了我的数据库,加载了数据库库并尝试了所提供的所有解决方案,尽管它们没有用完。

    请帮我找一个解决方案。 谢谢。     These are the errors I get

    解决

    应该命名模型,就像我的情况一样, Technology_model.php 。 此模型的相应类别也是 Technology_Model

3 个答案:

答案 0 :(得分:1)

当您使用$this->load->model()时,大写与查找模型类无关 - Technology_Model将按照technology_model的方式工作。但是,使用的字符串将是类的实例的名称,并且区分大小写 - 与任何其他PHP var一样。

换句话说,如果你这样做:

$this->load->model('Technology_Model'); 

然后要访问该类实例的方法,您需要使用相同的(区分大小写)单词,即

$this->Technology_Model->getData(); 

不使用完全相同的字符串会导致您看到的错误。

所有这一切,我的做法是使用全部小写的实例名称。对于文件和类名,只有第一个字符是大写。因此文件为Technology_model.php,类定义为class Technology_model extends CI_Model

它将加载到$this->load->model('technology_model');

的控制器中

答案 1 :(得分:0)

我同意@DFriend的回答,虽然我使用某种独特的变量命名个人标准化,但没有任何问题:

文件名:

Technology_m.php // sparing few chars

班级名称:

Technology_m

Loader方法参数:

$this->load->model('Technology_m');

接近模型方法/属性:

$this->Technology_m->getData();

因为您可以使用ucfirst()而不是库本身调用模型,因此我的内部系统化和变量约定。我使用ucfirst()模型在我的控制器中的所有调用中遵循模型约定,如上所述,但我也使用来自strtolower()标准之后的控制器的库调用。这样,看到第一眼看到的代码片段,我就可以确定某些东西是模型还是库(实例/属性/方法)。

答案 2 :(得分:0)

看起来CI基本上找不到你的模型的PHP文件,因此无法调用它认为是不存在的类的getData()。您还没有给我们CI的目录结构,但AFAIK取决于您的模型所在的位置,那么其PHP文件的路径需要反映出来。

例如,我自己的管理模型位于: Codeigniter / application / models / admin 。因此,如果我需要从控制器调用管理模型,我会这样做:

$this->load->model('admin/my_model', 'MyAdmin', true); $data = $this->MyAdmin->get();

请注意第一个参数中我的模型目录的相对路径以及第二个和参数,它声明了一个变量,您可以在其上运行模型的方法(可选,仅使用它作为示例)