我正试图根据客户端条件过滤应用程序中返回的所有内容。这是在我的AppModel:中
public function beforeFind($queryData) {
parent::beforeFind();
$queryData['conditions'] = array('client_id' => 2);
$this->log($queryData);
}
虽然它没有过滤返回的内容,但条件信息会显示在日志中。我做错了什么?
使用beforeFind(),如果您希望find使用已修改的$queryData
数组,则应该返回该数组。这是您当前的问题。
public function beforeFind($queryData) {
parent::beforeFind();
$queryData['conditions'] = array('client_id' => 2);
return $queryData;
}
然而,你还有其他一些小问题,可能会给你带来麻烦。
您不应该在beforeFind()中直接设置条件,而是添加。如果您调用带有条件的find会怎么样?考虑一下:
$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
的另一个条件。您还应该确保说明条件中的字段属于哪个模型。这是一种很好的做法,如果您有两个模型,其中有一个名为
client_id
的字段,则可以对代码进行未来验证。您可以使用$this->alias
来获取当前模型的别名,如果您为模型使用了不同的别名,这也将允许您的代码工作。
所以您的最终代码应该是:
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;
}
我遵循BadHorsie的解决方案,并将其抽象如下:
- 在继续之前检查父项的beforeFind的结果
- 以其他顺序使用array_merge,以使默认条件确实默认
- 使用$this->别名,这样就不需要更改类名
尝试更改为:
public function beforeFind($queryData) {
parent::beforeFind();
$queryData['conditions'] = array('client_id' => 2);
$this->log($queryData);
return $queryData; //return the modified $queryData
}