CakePHP未在生产服务器上加载与模型关联的属性
这是一个奇怪的 我有一个本地服务器,我在上面开发应用程序。我开发的一个产品评论应用程序在上面完美地工作,并利用了Cake的关联建模($hasMany,$belongsTo,et.al.) 将此应用程序推送到生产服务器后,将失败。给我一条错误消息:CakePHP未在生产服务器上加载与模型关联的属性,cakephp,associations,models,Cakephp,Associations,Models,这是一个奇怪的 我有一个本地服务器,我在上面开发应用程序。我开发的一个产品评论应用程序在上面完美地工作,并利用了Cake的关联建模($hasMany,$belongsTo,et.al.) 将此应用程序推送到生产服务器后,将失败。给我一条错误消息: Notice (8): Undefined property: AppModel::$Product [APP/controllers/reviews_controller.php, line 46] ReviewsController::home(
Notice (8): Undefined property: AppModel::$Product [APP/controllers/reviews_controller.php, line 46]
ReviewsController::home() - APP/controllers/reviews_controller.php, line 46
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 204
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 171
[main] - APP/webroot/index.php, line 83
我已经调试了debug()。数据库是镜像副本(确切地说,生产服务器是从devdb导入的),我可以手动加载模型,这告诉我它与db的连接很好
到底发生了什么事
更新
来自生产服务器的sql查询如下所示:
SELECT `Review`.`id`, `Review`.`title`, `Review`.`product_id`, `Review`.`score`, `Review`.`submitted`, `Review`.`reviewed`, `Review`.`right`, `Review`.`wrong`, `Review`.`user_id`, `Review`.`goals`
FROM `reviews`
AS `Review`
WHERE 1 = 1
ORDER BY `Review`.`submitted` desc LIMIT 10
来自dev服务器的sql查询如下:
SELECT `Review`.`id`, `Review`.`title`, `Review`.`product_id`, `Review`.`score`, `Review`.`submitted`, `Review`.`reviewed`, `Review`.`right`, `Review`.`wrong`, `Review`.`user_id`, `Review`.`goals`, `User`.`id`, `User`.`username`, `Product`.`id`, `Product`.`name`
FROM `reviews`
AS `Review`
LEFT JOIN `users` AS `User` ON (`Review`.`user_id` = `User`.`id`)
LEFT JOIN `products` AS `Product` ON (`Review`.`product_id` = `Product`.`id`)
WHERE 1 = 1
ORDER BY `Review`.`submitted` desc LIMIT 10
更新2
以下是错误指向的一些代码:
$title = $this->Review->Product->find( 'first', array( 'fields' => array( 'Product.name' ), 'conditions' => array( 'Product.id' => $filter ) ) );
更新3
<?php
class Review extends AppModel {
var $name = 'Review';
var $displayField = 'title';
//The Associations below have been created with all possible keys, those that are not needed can be removed
var $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
),
'Product' => array(
'className' => 'Product',
'foreignKey' => 'product_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
}
?>
我遇到了这个问题,对我来说,这是因为一个数据库表中缺少一个字段。我会三次检查以确保两个DB完全相同(尽管你说它们是…):请随意使用这个7年的应用程序来检查它们:d
其他有此问题的人谈到了文件名问题,并且所有文件都应该小写,因此这可能也是需要检查的…实际上,从快速浏览的角度来看,它可能值得用于确保数据调用的一致性
如果您不想经历添加containable的麻烦(但我强烈建议您这么做——这是cakephp我最喜欢的功能之一),您可能需要在find()调用中进行设置,以确保相关模型已加载。您有没有办法不用通过ftp查看服务器上的文件?我遇到了类似的问题,文件上的时间戳被弄乱了,服务器不会更新文件。我不得不删除这些文件,然后重新上传。你可能已经试过了,但我只是想我会建议的可能性。可能服务器上的某些文件已经过时
祝你今天愉快 您是否可以粘贴审阅模型、产品模型、AppModel、AppController以及从中获取错误的控制器
该行:
注意(8):未定义的属性:AppModel::$Product[APP/controllers/reviews\u controller.php,第46行]
似乎表明审阅模型正在加载AppModel,而不是您希望它加载的文件。在这种情况下,审查模型将不会有产品关联。您可以打印stacktrace以查看,下面是我从中获取的一些代码
echo“Stack
”;
$aCallstack=debug_backtrace();
回显“filelinefunctionargs”;
foreach($aCallstack作为$aCall)
{
如果(!isset($aCall['file']))$aCall['file']='[PHP内核]”;
如果(!isset($aCall['line']))$aCall['line']='';
回显“{$aCall['file']}{$aCall['line']}”。
“{$aCall['function']}”;
调试($aCall['arg']);
回声“;
}
回声“;
模具();
但是,要看完这一切还是很困难的。您是否清除了缓存(即tmp文件夹)?如果它发生在一个地方,而不是另一个地方,听起来好像部署中出现了问题。我不知道Cake会忽略关联的原因。如果我至少能找出从哪里开始查找该问题,就可以更容易地找出哪个文件显然失败了。你能把代码放在调用产品模型的地方吗?你是如何在Review Model中定义关系的?蛋糕似乎忽略了该模型的所有关系。你能测试一下其他车型是否有这种情况吗?我会检查并确认,但我相当确定在这方面所有的东西都是洁净的。做了一个区分,没有任何区别:\n我几乎完全不知道这一款。这完全没有意义。事实证明,我用来移动文件的FTP客户端无法将最初的caps模型名称覆盖为我尝试根据第二个解决方案测试的小写名称。修正后的模型完全小写,效果非常好。对我来说,这简直是白痴般的浪费时间。在Windows上开发和在Unix上部署时,我也遇到过类似的问题,真烦人!这种情况在开发环境和生产环境之间会发生怎样的变化?它不应该-但是如果您将递归设置为1或2/包含的用户+产品模型,并且它仍然没有获取关联的模型数据,那么您就知道问题出在别处了。感谢您的反馈。实际上,我对大多数服务器操作都使用SSH,所以所有文件显然都是最新的。更不用说我已经尝试了3次重新上传整个应用程序。那么为什么它只能在生产服务器上而不能在开发服务器上这样做呢?
echo "<div>Stack<br /><table border='1'>";
$aCallstack=debug_backtrace();
echo "<thead><tr><th>file</th><th>line</th><th>function</th><th>args</th></tr></thead>";
foreach($aCallstack as $aCall)
{
if (!isset($aCall['file'])) $aCall['file'] = '[PHP Kernel]';
if (!isset($aCall['line'])) $aCall['line'] = '';
echo "<tr><td>{$aCall['file']}</td><td>{$aCall['line']}".
"</td><td>{$aCall['function']}</td><td>";
debug (($aCall['arg']));
echo "</td></tr>";
}
echo "</table></div>";
die();