beforeFind()添加条件

时间:2013-08-07 03:53:56

标签: php cakephp cakephp-2.0

我正在尝试根据客户端条件过滤在我的应用中返回的所有内容。这是我的AppModel:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);
    $this->log($queryData);
}

虽然它不会过滤返回的内容,但条件信息会显示在日志中。我做错了什么?

3 个答案:

答案 0 :(得分:6)

使用beforeFind(),如果希望find使用它,则应返回已修改的$queryData数组。这是你目前的问题。

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);
    return $queryData;
}

但是,您还有其他一些小问题可能导致您遇到问题。

  1. 您不应该在beforeFind()中直接设置条件,而是添加。如果你打电话给有条件的发现怎么办?考虑一下:

    $this->MyModel->find('first', array(
        'conditions' => array(
            'MyModel.active' => 1
        )
    ));
    

    您希望find使用该条件,但也希望您的beforeFind()使用您的beforeFind()自动仅返回client_id = 2的结果。不幸的是,在你的beforeFind()中使用了这一行:

    $queryData['conditions'] = array('client_id' => 2);
    

    你刚刚完全覆盖了条件数组,并且失去了MyModel.active = 1的其他条件。

  2. 您还应该确保说明条件中的字段属于哪个模型。这是一个很好的做法,如果你有两个模型有一个名为client_id的字段,那么将来会证明你的代码。您可以使用$this->alias获取当前模型的别名,如果您为模型使用了不同的别名,也可以使代码正常工作。

  3. 所以你的最终代码应该是:

        public function beforeFind($queryData) {
            parent::beforeFind();
            $queryData['conditions'][$this->alias . '.client_id'] = 2;
            return $queryData;
        }
    

答案 1 :(得分:1)

public function beforeFind($queryData)
{
    if(parent::beforeFind($queryData) !== false)
    {
        $defaultConditions = array($this->alias . '.client_id' => 2);
        $queryData['conditions'] = array_merge($defaultConditions, $queryData['conditions']);
        return $queryData;
    }
    return false;
}

我遵循了BadHorsie的解决方案并将其抽象如下:

  • 在进一步检查之前检查父亲的事先检查结果
  • 在其他顺序中使用array_merge以便使用默认条件 确实是默认的
  • 使用$ this->别名,这样您就不需要更改类名

答案 2 :(得分:0)

尝试改为:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);    
    $this->log($queryData);
    return $queryData; //return the modified $queryData
}