将findBy参数传递给afterFind的回调方法

时间:2012-09-23 20:42:49

标签: php cakephp cakephp-appmodel

我正在尝试捕获某个findBy调用(使用afterFind),其中:

如果$ results为空(或者您尝试查找的值不存在),但是参数值在另一个表中找到,那么它将修改$ results为有效

某些控制器操作得到了这个:

$this->User->findByUsername("Bingo"); // yes, username Bingo doesnt exist on users table

用户模型:

function afterFind($results, $primary){
    if(empty($results)) {
        if(in_array($findbyparameter, array("Bingo", "Bingo1", "Bingo2"))) {
            // modify $results
        }
    }
}

问题是,如何获得$ findbyparameter?

谢谢!所有帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我没有使用这些便捷方法,但您可以将变量作为Model属性传递,如下所示:

//where you search 
$this->User->searchPhrase = "Bingo";
findByUsername($this->User->searchPhrase);

//Model
function afterFind($results, $primary){
    if(empty($results)) {
        if(in_array($this->searchPhrase, array("Bingo", "Bingo1", "Bingo2"))) {
            // modify $results
        }
    }
}

这不是最漂亮的方法,但我想它会起作用。尝试在afterFind方法中print_r($ this),看看你是否可以找到你搜索的短语。我相信它是在条件数组中传递的。

答案 1 :(得分:0)

也许您正在寻找自定义查找类型。自定义查找类型有两种状态:beforeafter

在您设置条件之前,之后您将检查数据并在必要时进行修改。在这两种状态下,您都可以访问查询选项。

在1.x和2.x中设置自定义查找略有不同(您还没有提到您正在使用的版本),因此您可以在书中查找具体内容。

简而言之,您可以添加将查找类型添加到模型的$findMethods属性中,然后将相应的方法名称添加到模型中。假设您调用自定义查找类型'byUsername'

protected function _findByUsername($state, $query, $results = array()) {
    if ($state === 'before') {
        // add your condition to the query, 
        return $query;
    } elseif ($state === 'after') {
        // modify $results if you need to
        return $results;
    }
}

你可以通过$this->User->find('byUsername', array('username' => $username));

来调用它

$query中,您可以使用密钥“用户名”,您可以将其添加到conditions的{​​{1}}密钥中。在这两种状态下,您都可以访问$query