4

我的问题是当我从用户表中获取用户的数据时,用户表的所有字段都是从用户表中获取的。但是我不想在其中包含密码和电子邮件地址,所以有什么方法可以只获取除密码和电子邮件地址?

问候。

4

4 回答 4

8

正如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')
));
于 2013-01-09T08:55:51.413 回答
2

你必须做这样的事情

$this->Model->find('all',array('fields'=>array('id','name')));     

只需在字段数组上提及您的要求字段。

如果你想从模型中获取然后试试这个

$this->find('all',array('fields'=>array('id','name')));     

谢谢。

于 2013-01-09T06:31:31.957 回答
0
$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'
)
于 2013-01-09T06:35:09.883 回答
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;在查找之前添加即可。

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

于 2013-01-09T07:27:16.773 回答