CakePHP未在生产服务器上加载与模型关联的属性

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(

这是一个奇怪的

我有一个本地服务器,我在上面开发应用程序。我开发的一个产品评论应用程序在上面完美地工作,并利用了Cake的关联建模($hasMany,$belongsTo,et.al.)

将此应用程序推送到生产服务器后,将失败。给我一条错误消息:

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();