仅在CAKEPHP中的find上获取一些字段

时间:2013-01-09 06:28:27

标签: cakephp cakephp-appmodel

我的问题是当我从users表中获取用户数据时,用户表的所有字段都从users表中获取..但我不想包含密码和电子邮件地址,所以有没有办法只提取密码和电子邮件地址以外的字段?

问候。

4 个答案:

答案 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;

我能想到的这种方法的唯一缺点是,如果要在数据库中添加或删除字段,则需要更新上述代码中的字段数组。