Codeigniter with Yii2    

Codeigniter和Yii2的结合

Model fields() 方法的使用

7年前发布  · 881 次阅读
  model  fields 

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

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

class ExampleModel extends \yii\db\ActiveQuery
{
    // ...

    // 明确列出每个字段,适用于你希望数据表或模型属性修改时不导致你的字段修改(保持后端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.