我的问题是当我从用户表中获取用户的数据时,用户表的所有字段都是从用户表中获取的。但是我不想在其中包含密码和电子邮件地址,所以有什么方法可以只获取除密码和电子邮件地址?
问候。
我的问题是当我从用户表中获取用户的数据时,用户表的所有字段都是从用户表中获取的。但是我不想在其中包含密码和电子邮件地址,所以有什么方法可以只获取除密码和电子邮件地址?
问候。
正如juhana所提到的,您不需要使用 find 调用返回的所有字段。目前尚不清楚您要解决的实际问题是什么,在未来的问题中澄清这些细节符合您的利益。
对于直接在您的用户模型上的查询,您可以使用如下逻辑:
public function beforeFind($queryData) {
if (empty($queryData['fields'])) {
$schema = $this->schema();
unset($schema['password']);
unset($schema['email']);
foreach (array_keys($schema) as $field) {
$queryData['fields'][] = $this->alias . '.' . $field;
}
return $queryData;
}
return parent::beforeFind($queryData);
}
对于查询另一个模型的查询,这不会做任何事情,例如
$results = $PostModel->find('all', array(
'contain' => array('User')
));
在上述情况下,将返回所有用户字段。对于这样的用途,最好明确定义您的字段列表,而不是依赖任何自动魔术:
$results = $PostModel->find('all', array(
'contain' => array('User')
'fields' => array('Post.*', 'User.name')
));
你必须做这样的事情
$this->Model->find('all',array('fields'=>array('id','name')));
只需在字段数组上提及您的要求字段。
如果你想从模型中获取然后试试这个
$this->find('all',array('fields'=>array('id','name')));
谢谢。
$this->User->find('all',array('fields'=>array('User.id','User.name','User.created', etc etc)));
你可能会注意到我在我的字段声明中使用了 Model.field ,这是为了以防你在任何相关模型中有任何冲突的字段名称。
摘自此处的 CakePHP 手册,在模型上使用 Find 方法时,您可以使用以下所有这些选项。
array(
'conditions' => array('Model.field' => $thisValue), //array of conditions
'recursive' => 1, //int
'fields' => array('Model.field1', 'DISTINCT Model.field2'), //array of field names
'order' => array('Model.created', 'Model.field3 DESC'), //string or array defining order
'group' => array('Model.field'), //fields to GROUP BY
'limit' => n, //int
'page' => n, //int
'offset' => n, //int
'callbacks' => true //other possible values are false, 'before', 'after'
)
将此添加到您的User
模型中:
public function beforeFind($queryData) {
if (isset($this->includeAllFields)) {
return $queryData;
}
if (empty($queryData['fields'])) {
$queryData['fields'] = array(
// Specify all fields EXCEPT for "password" and "email".
'User.field1',
'User.field2',
'User.field3'
);
}
return $queryData;
}
$this->includeAllFields
不是 CakePHP 的一部分;这是我编造的自定义属性。如果出于某种原因,您需要包含密码和电子邮件地址,只需$this->User->includeAllFields = true;
在查找之前添加即可。
我能想到的这种方法的唯一缺点是,如果曾经在数据库中添加或删除字段,则需要更新上述代码中的字段数组。