beforeFind()添加条件

Jus*_*ung 4 php cakephp cakephp-2.0

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

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

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

Bad*_*sie 6

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

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

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

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

    $this->MyModel->find('first', array(
        'conditions' => array(
            'MyModel.active' => 1
        )
    ));
    
    Run Code Online (Sandbox Code Playgroud)

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

    $queryData['conditions'] = array('client_id' => 2);
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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