Mysql , sql如何匹配字典内容

问题描述?

假如我有一条sql:

select id ,sex ,nation , type1,type2,type3,... from tb_people ;
//然后有一个字典表格
sex     1     男
sex     2     女
nation     1     汉族
nation     2     苗族
...
nation     n     xxxx
type1     1     aaa
type1     2     bbb
type2    x    xxx
...

我想通过sql ,查询出结果为各字段的字典键值,即:
数据库中sex存储的1,2转换为男、女 ,存储的nation转换为汉族,xx族,
用过model的自定义属性,字段多太麻烦了,有个表有10多个要转换的字段。。。
也想过通过本地化,但是很多使用场景获取数据都是json格式,处理起来还是麻烦。
所以看看万能的大佬们有什么优雅的解决方法没得。
感谢!!!

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 16
1年前 评论
____Laravel (楼主) 1年前
____Laravel (楼主) 1年前

目前我能想到最方便的是,把字典固化到lang中,然后查询结果

$data = AModel::get()->each(function($item, $key){
        $item->sex = __('sex ' . $item->sex) ;
        $item->nation= __('sex ' . $item->nation) ;
        ...
        ...
})
1年前 评论

属性修改器嫌麻烦,那就 join 查询出来不就好了
担心效率啥的,就查数据,在查字典,做个循环匹配处理

1年前 评论
____Laravel (楼主) 1年前

这个方案我会的,就是觉得太麻烦了, 字段多的时候,模型太臃肿了。。、

class AModel extends Model
{
    protected function sexText(): Attribute
    {
        return Attribute::make(
            get: function ($value, $attributes) {
                return ['1'=>'男' , '2'=>'女'][$attributes['sex']];
            }
        );
    }
}
1年前 评论

可以把字典存到文件里,读文件。修改也是修改文件内容

1年前 评论

key 唯一 写个函数,传进去 sex , 1

function ($key, $value)
{
    ...
     return '男' 
}
1年前 评论

如何你只用sql的话可以这样写

SELECT
    `tb_people`.`id`,
    CASE `tb_people`.`sex`
        WHEN 1 THEN '男'
        WHEN 2 THEN '女'
        ELSE ''
    END AS `sex`,
    CASE `tb_people`.`nation`
        WHEN 1 THEN '汉族'
        WHEN 2 THEN '苗族'
        ELSE ''
    END AS `nation`,
    ...
FROM `tb_people`

但如何用于数据返回,我建议通过模型修改器,修改器可以复用, 你可以定义一个全局model_options 的配置文件,记录所有模型的选项或者写在每个模型扩展trait中,这样模型就不臃肿了,如

<?php

//config 文件中
return [
    'model_name' => [
        'sex' => [1 => '男', 2 => '女'],
        'nation' => [1 => '汉族', 2 => '苗族']
    ]
];


trait modelAttrTrait
{
    protected $attrOptions = [
        'sex' => [1 => '男', 2 => '女'],
        'nation' => [1 => '汉族', 2 => '苗族']
    ];


    public function getTextAttribute($value)
    {
        return config('model-options.model_name.sex')[$value];
        //或者
        return $this->attrOptions['sex'][$value];
    }
}
1年前 评论
____Laravel (楼主) 1年前

用php8.1以上的话可以试试枚举

1年前 评论
sanders

提供个不成熟的思路哈,语言包肯定是可以用的。

# 如果你存在语言包 dict.php
return [
    'sex' => [
        1 => '男',
        2 => '女',
    ],
];
....

# 那么借用你的代码,可以这样使用这个语言包
$data = AModel::get()->transform(fn($model, $key) =>
    collect($model->toArray())->transform(fn($value, $field) => __("dict.$field.$value")
);
1年前 评论

试试 Chatgpt 的答案 :joy:

file

1年前 评论
____Laravel (楼主) 1年前
____Laravel (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!