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

时间:2011-07-11 16:53:17

标签: cakephp associations models

这很奇怪。

我有一个本地服务器,我在其上开发应用程序。我开发的产品评论应用程序完美无缺,并利用了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()'d $this并且它显示为白天,当本地服务器正在加载相关模型时,生产服务器不是。这些数据库是镜像重复的(字面意思是,生产服务器是从dev 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

来自开发服务器的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' => ''
    )       
);
}
?>

5 个答案:

答案 0 :(得分:2)

我遇到了这个问题,对我而言,这是由于其中一个数据库表中缺少字段。我会进行三重检查以确保两个数据库完全相同(尽管你说它们是......):随意使用这个有7年历史的应用程序来检查它们:D http://www.mysqldiff.org/

有这个问题的其他人谈到了文件名问题,并且所有文件都应该是小写的,因此可能需要检查...

答案 1 :(得分:0)

实际上 - 从快速浏览一下,使用containable来确保数据调用是一致的可能是值得的。

如果你不想经历添加可容纳的麻烦(但我会敦促你这样做 - 这是我最喜欢的cakephp功能之一),你可能想在你的发现中设置recursive ()调用只是为了确保加载了相关的模型。

答案 2 :(得分:0)

您是否有办法在不通过ftp的情况下查看服务器上的文件?我有一个类似的问题,其中时间戳搞砸了文件,服务器不会更新文件。我不得不删除文件,然后重新上传它们。你可能已经试过了,但我只是觉得我会建议这种可能性。也许其中一些文件已在服务器上过时。

祝你有美好的一天!

答案 3 :(得分:0)

您可以将Review模型,产品型号,AppModel,AppController和您收到错误的控制器粘贴到。

该行: 注意(8):未定义属性:AppModel :: $ Product [APP / controllers / reviews_controller.php,第46行]

似乎表示Review Model正在加载AppModel而不是您想要的文件。在这种情况下,Review模型将没有Product关联。

答案 4 :(得分:0)

你可以打印堆栈跟踪看看,这里是我从php.net抢夺的一些代码

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

虽然很难看清楚这一切。