4

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

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

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

4

3 回答 3

6

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

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

但是,您还有其他一些小问题可能会导致您出现问题。

  1. 您不应该在 beforeFind() 中直接设置条件,而是添加它。如果你调用有条件的 find 怎么办?考虑一下:

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

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

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

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

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

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

    public function beforeFind($queryData) {
        parent::beforeFind();
        $queryData['conditions'][$this->alias . '.client_id'] = 2;
        return $queryData;
    }
于 2013-08-07T15:47:34.103 回答
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 的解决方案并将其抽象如下:

  • 在进一步检查之前检查父母的 beforeFind 的结果
  • 以其他顺序使用 array_merge 以便默认条件是真正的默认
  • 使用 $this->alias 这样您就不需要更改类名
于 2014-12-05T09:41:05.993 回答
0

尝试更改为:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('client_id' => 2);    
    $this->log($queryData);
    return $queryData; //return the modified $queryData
}
于 2013-08-07T04:22:14.397 回答