0

我是 CakePHP 的新手,我不得不维护/开发一个 CakePHP 应用程序,并努力在其中一个模型中删除 BelongsTo。

该代码已从另一个使用更多相关表的项目中复制。在新项目中,我不需要这些关系,因为它在我真正想摆脱的查询中创建 LEFT JOINS 以加快速度。所以我进入模型并删除了$belongsTo属性..

当我转到主页时,我现在收到警告:-

Warning (512): Model "Product" is not associated with model "ParentProduct"
 [CORE/Cake/Model/Behavior/ContainableBehavior.php, line 343]

如果我关闭调试它不会显示,但我想知道为什么会生成此消息。我找不到任何关于我应该如何删除belongsTo关系的信息。

任何帮助表示赞赏。

4

2 回答 2

0

所以我进入模型并删除了 $belongsTo 属性

因为你要求它

错误使用可包含行为时会显示此类错误。

例如,考虑用户 hasMany 文章,以及以下代码:

$User->find('all', array(
    'contain' => array(
        'Article'
    )
));

这将返回所有用户及其文章(仅),而不管存在的任何其他关联。

如果请求的关联未定义:

$User->find('all', array(
    'contain' => array(
        'Article',
        'Comment'
    )
));

Containable 将生成一个警告,以便开发人员知道您的结果中不会有任何评论,这表明有错字或其他类型的开发错误(啊......它是用户<-文章<-评论)。

这与您所描述的一致,因为模型关联已被修改,但(显然)不是应用程序代码。

于 2013-07-06T08:40:23.440 回答
0

消息已生成(很可能),因为在您的控制器中(首先检查 ParentProductsController)类似于

$this->ParentProductsController->Product->find();

该模型关联不再存在,因为您想摆脱它,因此 ParentProducts 无法调用 Product。您需要将这样的呼叫更改为

ClassRegistry::init('the_name_of_the_model');

(在这种情况下ClassRegistry::init('Product');)或加载模型

$this->loadModel('Product');

现在,只有在调用与当前控制器无关的模型时才需要这样做。如果您Product->find从 ProductsController 调用,则不会出现错误。

好的,这就是错误的原因。
但是现在:我不建议您删除该关联。确实没有必要,即使它仍然存在于数据库中,您也可以删除代码中的逻辑关联。还有其他方法可以避免对数据库的左连接和无用查询,而不会伤人。

如果您想加快速度,请阅读Containable Behavior并将所有模型设置为$recursive = -1递归文档)。这样,除非您明确说明,否则您将不会获得 LEFT JOINS。

于 2013-07-05T15:56:24.503 回答