跨插件的两个模型进行查询时出错-CakePHP

跨插件的两个模型进行查询时出错-CakePHP,cakephp,plugins,model,Cakephp,Plugins,Model,我正在开发一个带有ModelA的插件,它有许多ModelB。我可以通过简单的saveAll跨两个模型正确保存所有数据 但是当我试图在两个模型之间执行一个简单的查询时,会发生一些奇怪的事情。 此查询工作: 但在ModelB上添加条件不起作用: 但这项工作: 有人有主意吗?谢谢 单独查询 CakePHP对hasMany和HABTM关联使用单独的查询。第一个查询检索主模型数据,但不加入关联的表,而第二个查询使用来自第一个查询结果的ID来获取关联的记录,然后将这些记录合并到结果中 现在的问题是,您的条件

我正在开发一个带有ModelA的插件,它有许多ModelB。我可以通过简单的saveAll跨两个模型正确保存所有数据

但是当我试图在两个模型之间执行一个简单的查询时,会发生一些奇怪的事情。

此查询工作: 但在ModelB上添加条件不起作用: 但这项工作: 有人有主意吗?谢谢

单独查询 CakePHP对
hasMany
HABTM
关联使用单独的查询。第一个查询检索主模型数据,但不加入关联的表,而第二个查询使用来自第一个查询结果的ID来获取关联的记录,然后将这些记录合并到结果中

现在的问题是,您的条件将应用于第一个查询,其中不包括关联模型的表,因此会出现错误

另一种方法是,在
ModelB
上查找,它是一个
属于
关联,其中只使用一个查询,另一个表加入该查询,因此条件适用得很好

可以选择手动联接 虽然在您的特定示例中,简单地查询
modelbs
更容易,但也可以通过使用手动定义的联接来解决此问题,如烹饪书中所述:

$ModelA->find('all', array(
    'joins' => array(
        array(
            'table' => 'model_bs',
            'alias' => 'ModelB',
            'type' => 'LEFT',
            'conditions' => array('ModelB.id = ModelA.model_b_id')
        )
    ),
    'conditions' => array(
        'ModelB.id' => 2
    )
));
通过这种方式,
model_bs
表被加入到第一个查询中,您可以安全地测试
ModelB
上的条件

请注意,如果您不想实际检索
ModelB
的数据(这又是一个附加查询),则需要将
recursive
设置为
-1

附言 切勿实例化模型,如
newmodel()
,使用
ClassRegistry::init()
Controller::loadModel()
,或定义要加载到
Controller::$uses中的模型

$ModelA = new ModelA();
$result = $ModelA->find('all', array(
    'recursive' => 1,
    'conditions' => array(
        'ModelB.id' => 2
    )
));
pr($result);
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'ModelB.id' in 'where clause'
$ModelA = new ModelA();
$result = $ModelA->ModelB->find('all', array(
    'recursive' => 1,
    'conditions' => array(
        'ModelA.field' => 'value'
    )
));
pr($result);

Array
(
    [0] => Array
        (
            [ModelB] => Array
                (
                    [id] => 2
                    [model_a_id] => 1
                )
            [ModelA] => Array
                (
                    [id] => 1
                    [field] => value
                )
        )
)
$ModelA->find('all', array(
    'joins' => array(
        array(
            'table' => 'model_bs',
            'alias' => 'ModelB',
            'type' => 'LEFT',
            'conditions' => array('ModelB.id = ModelA.model_b_id')
        )
    ),
    'conditions' => array(
        'ModelB.id' => 2
    )
));