如何在CakePHP 1.3中添加相关(belongsTo)模型的条件?

时间:2010-12-08 16:24:56

标签: php cakephp cakephp-1.3

我见过类似的问题,但他们的答案对我来说似乎没有用。这看起来应该是非常简单的,所以我觉得非常愚蠢。

我有一个名为Preappform的模型,它有许多代理模型(对于Preappform都有belongsTo)。 Agent模型有一个包含哈希的字段。当我检索Preappform时,它会自动返回任何与相应外键相关的代理,但是我想限制此代理列表以仅包含其Agent.hash字段与提供的条件匹配的代理。

这是当前的代码:

模型/ agent.php

class Agent extends AppModel {
    var $name = "Agent"; // Singular for instances. 
    var $belongsTo = array('Preappform');
}

模型/ preappform.php

class Preappform extends AppModel {
    var $name = "Preappform";
    var $hasMany = array('Agent'); 
    /* snip, some validation stuff */
}

在控制器中......(以其他人为例)

// $id = 18
// $hash is set to false, or a nonexistent value. 

$the_form = $this->Preappform->find('first', 
    array(
        'conditions' => array('Preappform.id' => $id), 
        'contain' => array('Agent' => array('conditions' => array('Agent.hash' => $hash))) 
    )    
); 

结果:

Arrray
(
    [Preappform] => Array
        (
            [id] => 18
            [created] => 2010-12-03 08:56:12
            [modified] => 2010-12-03 08:56:12
            [completed] => 0
            /* ... */
        )


    [Agent] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [preappform_id] => 18
                    [hash] => f312d4b401fecc8ce0f8dca6eb7c1ca6ad9f5956
                )

            [1] => Array
                (
                    [id] => 2
                    [preappform_id] => 18
                    [hash] => f312d4b401fecc8ce0f8dca6eb7c1ca6ad9f5957
                )

        )

)

我已经在Preappform模型上玩了各种版本的“包含”和“递归”的不同值,但似乎无法过滤可用的代理。

我认为它会像

一样简单
$the_form = $this->Preappform->find(
    'first', 
    array('conditions' => array(
        'Preappform.id'=> $id, 
        'Agent.hash' => $hash
        ) 
    )
);

...但总是会出现“Unknown column:Agent ...”错误。

如何应用条件来过滤使用我的Preappform模型返回的代理?

3 个答案:

答案 0 :(得分:1)

在模型中

models/preappform.php // add this
var $actsAs = array('Containable');

在控制器

models/preappform.php
$the_form = $this->Preappform->find(
    'first', 
    array(
         'conditions' => array('Preappform.id' => $id) ,
         'contain' => array('Agent' => array('conditions' => array('Agent.hash'=>$hash)))
    )
);

答案 1 :(得分:1)

the answer by Ish Kumar类似,但有更正:

Preappform(父)模型应该“充当可包含”。

当我将以下行添加到Preappform模型时:

var $actsAs = array('Containable');

...以下代码中的'contains'条件开始按预期工作:

$the_form = $this->Preappform->find('first', 
    array(
        'conditions' => array('Preappform.id' => $id), 
        'contain' => array('Agent' => array('conditions' => array('Agent.hash =' => $hash))) 
    )
); 

谢谢!

答案 2 :(得分:0)

我相信你可以这样做: array('contain' => 'Agent.hash = "'.$hash .'"')