从控制器通过其控制器调用另一个模型中的函数时出现数据库错误

时间:2015-10-09 06:32:36

标签: php mysql cakephp runtime-error cakephp-2.3

在我的CakePHP 2.3中,我试图将一个功能从用户控制器调用到城市控制器,然后城市控制器从城市模型中调用一个功能。

用户控制器中的功能:

function get_cities(){  

    $list_cities = $this->City->get_all_cities();

}

城市控制器中的功能:

function get_all_cities(){

    return $get_cities = $this->City->get_all_active_cities();

}

城市模型中的功能

public function get_all_active_cities(){

        $cities=$this->find('all',array('conditions'=>array('City.status'=>1)));    
        return $cities;

    }

但我收到了数据库错误。

  

错误:SQLSTATE [42000]:语法错误或访问冲突:1064您   您的SQL语法有错误;检查对应的手册   您的MySQL服务器版本,以便在附近使用正确的语法   ' get_all_active_cities'在第1行

如何解决此问题? TIA。

4 个答案:

答案 0 :(得分:1)

快速提示,如果您只对调用模型功能感兴趣,可以在任何不需要调用控制器的控制器中注册模型。

e.g。您可以在用户控制器

中注册模型
$this->City = ClassRegistry::init('City');

然后致电

$this->City->get_all_active_cities()

http://api.cakephp.org/2.3/class-ClassRegistry.html#_init

相反,您也可以在Users控制器中使用var $uses = array('User','City');来实现相同的

另外检查由CakePHP生成的sql日志生成的sql查询问题更多地针对框架生成的查询。您可以使用Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual

进行验证

希望有所帮助, 欢呼声。

答案 1 :(得分:1)

您还可以在function get_cities(){ $this->loadModel('City'); $list_cities = $this->City->get_all_cities(); } 方法中加载城市模型。

喜欢以下代码

curl "https://api.keen.io/3.0/projects/PROJECT_ID/events/EVENT_COLLECTION?api_key=WRITE_KEY" -H "Content-Type: application/json" -d @purchase1.json

答案 2 :(得分:1)

  

在第1行的“get_all_active_cities”附近使用正确的语法

此错误消息表示此代码已执行:

$modelClass->get_all_active_cities();

然而模型类具有该方法,而是作为查询传递给mysql,因为that's how unhandled methods are implemented

方法名称中有拼写错误,或者$modelClass不是您认为的类

如果你改变你的控制器代码:

function get_cities(){  
    debug(get_class($this->City)); //
    die;
}

然后看“AppModel”,那么你的模型类根本没有被使用 - 典型的原因是:

  • 模型文件名称不正确
  • 模型文件位于错误的文件夹

这不是编写模型代码的正常方法

让一个名为get_all_active_cities的方法只是一个简单的查找并不是真的有用。它没有封装复杂性,或者使代码更清晰,可以说它使代码更难阅读,因为它隐藏了如此简单的东西。考虑简单地使用等效的find:

function get_cities(){  
    $params = [
        'conditions'=>[
            'City.status'=>1
        ]
    ];
    $list_cities = $this->City->find('all',$params);
    ...
}

另一种方法是创建一个finder method,以便查找逻辑与标准查找器完全相同,即。

function get_cities(){  
    $list_cities = $this->City->find('allActive');
    ...
}

使用:

class Article extends AppModel {
    public $findMethods = array('allAcctive' =>  true);

    protected function _findAllActive($state, $query, $results = array()) {
        if ($state === 'before') {
            $query['conditions'][$this->alias . '.status'] = 1;
            return $query;
        }
        return $results;
    }
}

这里的好处是上面的取景器的使用方式与其他取景器方法完全相同。

如果这是要应用于所有查找的条件,也请考虑使用a behavior with a beforeFind callback始终为您应用该条件。

答案 3 :(得分:1)

$这 - > loadModel( '城市'); 您可以直接使用来自城市的数据。希望这可以帮助你