【问题标题】:Error when loading Models to Controller CakePHP 1.3将模型加载到控制器 CakePHP 1.3 时出错
【发布时间】:2016-12-13 12:09:40
【问题描述】:

我将 2 个模型加载到我的控制器中。

var $uses = array( 'Territoryset', 'Users.User' );

我从模型中调用一个函数

$users = $this->User->getUsersList();

我有一个错误:

pg_query() [function.pg-query]:查询失败:错误:getUsersList 处或附近的语法错误

我改变了 $uses 的顺序

var $uses = array('Users.User', 'Territoryset');

然后我没有收到任何错误。我真的无法解释为什么调用顺序会有所不同?

【问题讨论】:

  • 这是我被要求修复的遗留代码,否则我不会在 1.3 上工作
  • 确实有BelongsTo在域集中的关系。 var $belongsTo = array('User' => array('className' => 'User', 'foreignKey' => 'user_id', 'conditions' => '', 'fields' => '', 'order' => '' ),

标签: cakephp cakephp-1.3


【解决方案1】:

缺少插件前缀

确实有BelongsTo在域集中的关系。

var $belongsTo = array(   
    'User' => array( 
        'className' => 'User', # <- no plugin prefix
        ...

有关背景信息,请参阅the docs regarding loading plugin models

此模型定义将通过加载 belongsTo 关联定义的行为,导致以下两个代码示例返回模型实例 model/user.php(如果存在)或 AppModel(如果不存在):

$x = ClassRegistry::init('User'); 
$x = ClassRegistry::init('Users.User');

本质上,这是由于 php4 中没有命名空间的限制——不可能加载两个具有相同名称的类,因此以给定名称加载的第一个类获胜。

首先使用别名'Users.User'来引用User模型时,文件plugins/users/model/user.php中的类将被加载(如果它存在的话)然后是this的一个实例 将为这两个代码示例返回类:

$x = ClassRegistry::init('User'); 
$x = ClassRegistry::init('Users.User');

因此uses 模型的顺序之所以有影响,是因为它确定UserUsers.User(由于域集模型中缺少插件前缀)是对该模型名称的第一个引用,因此哪个对象填充类注册表,以及为以后对User*.User 的所有引用返回哪个对象。

【讨论】:

  • 我遇到了问题,尽管即使更改了 $belongsTo 中的类也没有解决顺序问题,但现在我设法使用 $this->Territoryset->User->getUsersList();在我将 className 更改为“Users.User”之后
  • 我不知道您评论的开头是什么意思 - 但您更改的内容正是我建议您编辑的内容。
  • 抱歉问题仍然存在 var $uses ... 和 $this->User 但工作正常 $this->Territoryset->User->getUsersList();感谢您的帮助。
  • 我仍然不明白你的意思,但如果有什么不起作用,那么糟糕的代码比问题中的要多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
相关资源
最近更新 更多