Model fields() 方法的使用

技巧库 · forecho · 于 7年前 发布 · 19977 次阅读

在开发 Api 接口的时候你肯定有遇到过把数据库查出来的字段隐藏某些个的需求。下面我就来谈谈,怎么快速的实现这个效果。

yii\base\Model::fields() 默认返回模型的所有属性作为字段, yii\db\ActiveRecord::fields() 只返回和数据表关联的属性作为字段。 可覆盖 fields() 方法来增加、删除、重命名、重定义字段,fields() 的返回值应为数组,数组的键为字段名 数组的值为对应的字段定义,可为属性名或返回对应的字段值的匿名函数,特殊情况下,如果字段名和属性名相同, 可省略数组的键,例如

// 明确列出每个字段,适用于你希望数据表或模型属性修改时不导致你的字段修改(保持后端API兼容性)
public function fields()
{
    return [
        // 字段名和属性名相同
        'id',
        // 字段名为"email", 对应的属性名为"email_address"
        'email' => 'email_address',
        // 字段名为"name", 值由一个PHP回调函数定义
        'name' => function ($model) {
            return $model->first_name . ' ' . $model->last_name;
        },
    ];
}

// 过滤掉一些字段,适用于你希望继承父类实现同时你想屏蔽掉一些敏感字段
public function fields()
{
    $fields = parent::fields();

    // 删除一些包含敏感信息的字段
    unset($fields['auth_key'], $fields['password_hash'], $fields['password_reset_token']);

    return $fields;
}

// 如果只想修改某一个字段
public function fields()
{
    $fields = parent::fields();
    $fields['name'] = function ($model) {
        return $model->name . ' a' . $model->name;
    };

    return $fields;
}

警告: 模型的所有属性默认会被包含到API结果中,应检查数据确保没包含敏感数据,如果有敏感数据, 应覆盖fields()过滤掉,在上述例子中,我们选择过滤掉 auth_key, password_hash 和 password_reset_token.


如果这篇文章对您有帮助,不妨微信小额赞助我一下,让我有动力继续写出高质量的教程。

共收到 7 条回复 Yii2 Api开发 RESTful
say#17年前 0 个赞

请问下, 具体怎么用呢 比如说我的mysql语句是 $result = self::find()->select('*')->asArray()->all(); 怎么对 result 结果进行过滤呢??

forecho#27年前 0 个赞

@say #1楼 首先这个是给 api 开发用的。普通的 web 开发不是用这种方法过滤的。试一下这个:

$result = self::find()->select(['name','sex'])->asArray()->all(); 
kevin19a#36年前 0 个赞

'email' => 'email_address', 我在return里面使用了这种方式结果报错了。 "name": "Unknown Property", "message": "Getting unknown property: api\models\UserInfo::userId", 以上是报错信息。我在注释里面添加了一行userId的还是报这个错误

forecho#46年前 0 个赞

@kevin19a #3楼 跟 userId 有什么关系,请再提供详细代码

这个是需要使用`ArrayHelper::toArray()` 才起作用的哈?

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册