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

被折叠的 条评论
为什么被折叠?



