TP5自定义解析属性的几种方式

本文探讨了在使用ThinkPHP5开发中,如何通过多种方式获取用户列表数据时,避免直接暴露性别字段,提供了foreach转换、获取器设置、追加关联属性和别名方法的详细比较和实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


使用TP5开发时,如果要获取列表中的数据,而又需要根据某些字段来变化查询出的结果时,如获取用户的性别,但又不想暴露原先的字段内容。使用TP5的常见解决方法有以下几种


1. 先获取数据,后foreach转换数据

public function users()
{
    $users = UserModel::field(['id', 'name', 'sex'])->select();
    $userData = [];
    foreach ($users as $user) {
        $userData[] = [
            'id'       => $user->id,
            'name'     => $user->name,
            'sex_name' => $user->sex === 1 ? '男' : '女',
        ];
    }
    return success('获取用户数据成功', $userData);
}

多了一遍循环,且多了些许冗余代码



2. 利用TP5框架的获取器来进行设置

# UserModel.php
function getSexAttr($value)
{
    if ($value === 0) {
        return '男';
    }
    if ($value === 1) {
        return '女';
    }
    return '未知';
}
# UserController.php
public function users()
{
    $users = UserModel::field([
        'id',
        'name',
        'sex'
    ])
        ->select();
    return success('获取用户数据成功', $users);
}

PS:如果想再获取原先的name,那么使用$user->getData('sex')即可



3. 利用TP5框架的追加关联属性来进行设置

# UserModel.php
function getSexNameAttr($value, $data)
{
    if ($data['sex'] === 0) {
        return '男';
    }
    if ($data['sex'] === 1) {
        return '女';
    }
    return '未知';
}
# UserController.php
public function users()
{
    $users = UserModel::field(['id', 'name', 'sex'])
        ->append(['sex_name'])
        ->hidden(['sex'])
        ->select();

    return success('获取用户数据成功', $users);
}

代码较为直观,但使用append的还要再使用hidden



4. 取巧利用TP5框架的获取器来变型设置

# UserModel.php
function getSexNameAttr($value)
{
    if ($value === 0) {
        return '男';
    }
    if ($value === 1) {
        return '女';
    }
    return '未知';
}
# UserController.php
public function users()
{
    $users = UserModel::field([
        'id',
        'name',
        'sex' => 'sex_name'
    ])
        ->select();

    return success('获取用户数据成功', $users);
}

利用起别名的方式,将sex同步给了sex_name,而sex_name也就会经过上面的获取器了



附:测试用表结构及数据

CREATE TABLE `user`  (
  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',
  `sex` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '性别:0-男 1-女',
  `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '注册日期',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = '用户表';


INSERT INTO `user` VALUES (1, 'test1', 1, '2021-03-28 21:37:17');
INSERT INTO `user` VALUES (2, 'test2', 0, '2021-03-10 21:37:26');
INSERT INTO `user` VALUES (3, 'three', 1, '2021-03-26 21:38:04');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值