我是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
关系的任何信息。
任何帮助表示感谢。
答案 0 :(得分:0)
消息已生成(最有可能),因为在您的控制器中(首先检查ParentProductsController)类似于
$this->ParentProductsController->Product->find();
模型关联不再存在,因为你想摆脱它,所以ParentProducts无法调用Product。您需要将此类呼叫更改为
ClassRegistry::init('the_name_of_the_model');
(在本例中为ClassRegistry::init('Product');
)或使用
$this->loadModel('Product');
现在,只有在调用与当前控制器无关的模型时才需要这样做。如果您从ProductsController调用Product->find
,则不会出现错误。
好的,这是导致错误的原因 但现在:我不建议您删除该关联。确实没有必要和你删除代码中的逻辑关联,即使它仍然存在于数据库中。 还有其他方法可以避免对数据库进行左连接和无用的查询,而不会削弱某些人。
如果您想加快速度,请阅读Containable Behavior,并将所有模型设置为$recursive = -1
(recursive doc)。这样,除非你明确说明,否则你不会获得LEFT JOINS。
答案 1 :(得分:0)
所以我进入了模型并删除了$ belongsTo属性
错误地使用containable behavior时会显示此类错误。
E.g。考虑User hasMany Article,以及以下代码:
$User->find('all', array(
'contain' => array(
'Article'
)
));
这将返回所有用户及其文章(仅限),而不管是否存在任何其他关联。
如果请求的关联未定义:
$User->find('all', array(
'contain' => array(
'Article',
'Comment'
)
));
Containable将生成一个警告,以便您(开发人员)可以知道结果中没有任何注释表示拼写错误或其他类型的开发错误(啊...它的用户< -Article< -Comment )。
这与您描述的内容保持一致,因为模型关联已被修改,但(显然)不是应用程序代码。