我的问题是当我从users表中获取用户数据时,用户表的所有字段都从users表中获取..但我不想包含密码和电子邮件地址,所以有没有办法只提取密码和电子邮件地址以外的字段?
问候。
答案 0 :(得分:8)
如juhana所述,您不需要使用查找调用返回的所有字段。目前尚不清楚您要解决的实际问题是什么,在未来的问题中澄清这些细节符合您的利益。
对于直接在您的用户模型上进行查询,您可以使用以下逻辑:
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')
));
答案 1 :(得分:2)
你必须做这样的事情
$this->Model->find('all',array('fields'=>array('id','name')));
只需在字段数组中提及您的需求字段。
如果你想从模型中获取,那么试试这个
$this->find('all',array('fields'=>array('id','name')));
感谢。
答案 2 :(得分:0)
$this->User->find('all',array('fields'=>array('User.id','User.name','User.created', etc etc)));
你可能会注意到我在我的字段声明中使用了Model.field,这是为了防止你在任何相关模型中有任何冲突的字段名称。
从CakePHP manual found here获取,在模型上使用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'
)
答案 3 :(得分:0)
将此添加到您的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;
。
我能想到的这种方法的唯一缺点是,如果要在数据库中添加或删除字段,则需要更新上述代码中的字段数组。