Php beforeFind()添加条件
我正在尝试根据客户端条件筛选应用程序中返回的所有内容。这在我的AppModel中: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
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;
}
但是,您还有一些其他小问题可能会导致后续问题
$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,这样就不需要更改类名
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;
}