Php beforeFind()添加条件

Php beforeFind()添加条件,php,cakephp,cakephp-2.0,Php,Cakephp,Cakephp 2.0,我正在尝试根据客户端条件筛选应用程序中返回的所有内容。这在我的AppModel中: public function beforeFind($queryData) { parent::beforeFind(); $queryData['conditions'] = array('client_id' => 2); $this->log($queryData); } 它不会过滤返回的内容,但是条件信息会显示在日志中。我做错了什么?尝试更改为: public fu

我正在尝试根据客户端条件筛选应用程序中返回的所有内容。这在我的AppModel中:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);
    $this->log($queryData);
}
它不会过滤返回的内容,但是条件信息会显示在日志中。我做错了什么?

尝试更改为:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);    
    $this->log($queryData);
    return $queryData; //return the modified $queryData
}
使用beforeFind()时,如果希望查找使用已修改的
$queryData
数组,则应返回该数组。这是你目前的问题

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);
    return $queryData;
}
但是,您还有一些其他小问题可能会导致后续问题

  • 您不应在beforeFind()中直接设置条件,而应将其添加到。如果您正在调用具有条件的查找,该怎么办?考虑这一点:

    $this->MyModel->find('first', array(
        'conditions' => array(
            'MyModel.active' => 1
        )
    ));
    
    您希望查找使用该条件,但也希望beforeFind()使用beforeFind()自动返回
    客户机\u id=2
    的结果。不幸的是,使用beforeFind()中的这一行:

    您刚刚完全覆盖了条件数组,并丢失了另一个条件
    MyModel.active=1

  • 还应确保说明条件中的字段所属的模型。这是一个很好的实践,如果您有两个模型,其中有一个名为
    client\u id
    的字段,那么您的代码将在将来得到验证。您可以使用
    $this->alias
    获取当前模型的别名,如果您对模型使用了不同的别名,则该别名也将允许您的代码工作

  • 那么您的最终代码应该是:

        public function beforeFind($queryData) {
            parent::beforeFind();
            $queryData['conditions'][$this->alias . '.client_id'] = 2;
            return $queryData;
        }
    
    我遵循BadHorsie的解决方案,并将其抽象为以下内容:

    • 在继续之前检查父级的beforeFind结果
    • 使用数组_以其他顺序合并,以使默认条件 你真的违约了吗
    • 使用$this->alias,这样就不需要更改类名

    不是在筛选之前,而是在查找之前。此外,如果未定义$query['conditions'],则数组合并将不起作用。是否尝试$query['conditions']=is_数组($query['conditions'])?数组合并($query['conditions',$defaultConditions):$defaultConditions;您可能需要编辑;)非常有用的帖子,更新了上面评论中提到的函数名。还需要注意的是,
    parent::beforeFind()
    还需要一个参数。我从实现中删除了这一行。(这是使用Cake 1.3)一种更简单、更直接的方法是执行
    $queryData['conditions'][$this->alias.'.client_id']=2@Fr0zenFyr是的,你是对的。这是几年前的事了,但我已经更新了答案。
    
        public function beforeFind($queryData) {
            parent::beforeFind();
            $queryData['conditions'][$this->alias . '.client_id'] = 2;
            return $queryData;
        }
    
    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;
    }