这很奇怪。
我有一个本地服务器,我在其上开发应用程序。我开发的产品评论应用程序完美无缺,并利用了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' => ''
)
);
}
?>
答案 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();
虽然很难看清楚这一切。