CakePHP find() 不能跨模型工作

Posted

技术标签:

【中文标题】CakePHP find() 不能跨模型工作【英文标题】:CakePHP find() not working accross models 【发布时间】:2009-10-23 19:44:42 【问题描述】:

我有一个非常奇怪的问题。我正在尝试使用适用于模型关系的条件进行查找。也就是说……

$this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2')));

...假设 Model 与 RelatedModel 具有 hasMany 关系。这个特别的 find 会发出以下错误消息:

警告 (512):SQL 错误:1054:“where 子句”中的未知列“RelatedModel.col2”[CORE/cake/libs/model/datasources/dbo_source.php,第 525 行]

查看正在做的SELECT,我很快注意到相关模型中的比较实际上放在了WHERE子句中,但是由于某种原因,FROM子句中唯一的东西是Model,没有RelatedModel的迹象.如果我删除使用关系的比较,相关模型将被拉入结果中。

我使用的是 Cake 1.2.4。乍一看,我看到的 1.2.4 -> 1.2.5 更新日志中没有任何内容涵盖这一点,您会认为这样一个明显的错误会在几天后被追捕并修复,而不是等待一个完整的月,并且在发布公告中没有提及任何内容。

那么,呃,发生了什么事?

【问题讨论】:

【参考方案1】:

如果您的模型使用 Containable 行为,请确保您包含这些模型。

首先,在您的 model_name.php 文件中:

class ModelName extends AppModel 
    var $actsAs = array('Containable');

然后在你的发现中:

$results = $this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2',
    ),
    'contain' => array('RelatedModel'),
));

如果不使用 Containable 行为,则尝试显式增加递归级别:

$results = $this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2',
    ),
    'recursive' => 1,
));

请注意,后一种方法很可能会检索到大量不必要的数据,从而降低应用程序的速度。因此,我强烈建议使用 Containable 行为。

【讨论】:

以上是关于CakePHP find() 不能跨模型工作的主要内容,如果未能解决你的问题,请参考以下文章

对这个复杂的 SQL 使用 cakephp 的 find 方法

CakePhp find 不获取 hasMany 关系

CakePHP 2.1 - 模型关联 - 保存和查找

在 CakePHP 中从模型中分页

从cakephp1.2&1.3中的另一个模型导入模型

CakePHP - 在模型中查找没有 hasMany 关系的 hasMany 关联?