在我的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。
答案 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( '城市'); 您可以直接使用来自城市的数据。希望这可以帮助你