【问题标题】:CakePHP not loading associated properties with model on production serverCakePHP 没有在生产服务器上加载与模型相关的属性
【发布时间】:2011-07-11 16:53:16
【问题描述】:

这很奇怪。

我有一个用于开发应用程序的本地服务器。我开发的一个产品评论应用程序可以完美运行,并利用 Cake 的关联建模($hasMany、$belongsTo 等)。

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

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' => ''
    )       
);
}
?>

【问题讨论】:

  • 你清除缓存(即tmp文件夹)了吗?
  • 如果它发生在一个地方而不是另一个地方,这听起来像是部署中出了问题。我不知道 Cake 会忽略关联的原因。
  • 好吧,如果我至少能弄清楚从哪里着手解决这个问题,就更容易找出哪个文件明显失败了。
  • 你能把调用产品模型的代码贴出来吗?
  • 您是如何定义 Review 模型中的关系的?似乎蛋糕忽略了该模型的所有关系。你能测试一下它是否发生在其他模型上吗?

标签: cakephp associations models


【解决方案1】:

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

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

【讨论】:

  • 我会检查并确定,但我相当确定在这方面一切都是犹太教的。
  • 做了一个差异,并没有任何区别:\我几乎完全失去了这个。这完全没有意义。
  • 事实证明,我用来移动文件的 FTP 客户端未能将初始大写模型名称覆盖为我尝试根据您的第二个解决方案测试的小写名称。修复后的模型完全小写,效果很好。对我来说这是多么愚蠢的浪费时间。
  • 我在Windows上开发和在Unix上部署时遇到了类似的问题,真的很烦!
【解决方案2】:

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

如果您不想经历添加可包含的麻烦(但我会敦促您这样做 - 这是我最喜欢的 cakephp 功能之一),您可能需要在 find() 中设置 recursive调用只是为了确保关联的模型已加载。

【讨论】:

  • 开发环境和生产环境之间会有什么变化?
  • 它不应该 - 但如果您将递归设置为 1 或 2 / 包含的用户 + 产品模型,并且它仍然没有获取关联的模型数据,那么您知道问题出在其他地方。
【解决方案3】:

你有没有办法在不通过 ftp 的情况下查看服务器上的文件?我遇到了类似的问题,文件中的时间戳被弄乱了,服务器不会更新文件。我不得不删除文件,然后重新上传。你可能已经尝试过了,但我只是想我会建议这种可能性。也许其中一些文件在服务器上已过时。

祝你有美好的一天!

【讨论】:

  • 感谢您的反馈。我实际上将 SSH 用于大多数服务器操作,因此所有文件显然都在那里并且是最新的。更不用说我已经尝试重新上传整个应用 3 次了。
【解决方案4】:

您能否将 Review 模型、Product 模型、AppModel、AppController 以及您从中收到错误的控制器粘贴到 bin 中。

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

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

【讨论】:

  • 那么为什么只在生产服务器上而不是在开发服务器上这样做呢?
【解决方案5】:

你可以打印堆栈跟踪来查看,这是我从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();

不过,看完这一切会很困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多