字符串(1,2,3,4)取出id为1,2,3,4的name值,拼成一个字符串(小明,小林,珊珊,小唐)

jackeykk
  • 57

困扰了挺久的问题,一直想不到怎么解决,A表里有个字段是存放在B表的关联id,比如(3,5,7,8)对应B表id为3 5 7 8 的数据,我想在前端页面把对应的这几个id的中文显示出来。

A表如下,group_id就是B表的id集合。
image.png

B表如下,我想取出对应的name,然后拼接成一个新的字符串,返回到A表里,返回给前端显示。
image.png

回复
阅读 1k
4 个回答

首先我觉得你这个表设计有问题,你这种多对多的关系应该专门做一个中间表来进行关联,那么有一下几种方案:

  1. 做一个存储过程,搜一下解决方案很多,就是把字符串按照指定字符拆分成数组,然后利用JOIN进行查询;
  2. 先查A表数据,然后程序遍历这堆数据,然后拆分group_id,然后再从数据库里用id IN(group_ids)来把数据查询出来,然后再做组装;
  3. 做一个中间关联表,用JOIN进行关联查询出来。

从这问题来看,我估计你这数据没多少,用第二种形式应该就可以了,如果数据量大的话,然后再做个缓存,缓存方案的话,就是如果触发了某条数据的更新,再把某条数据对应的缓存删除,不然的话直接从缓存取数据,就降低了数据库的查询。

    let a = [{group_id:'1,3,5,7,9'},{group_id:'1'}];
    let b = [{id:1,name:'name1'},{id:3,name:'name3'},{id:5,name:'name5'}];
    /**
     * @param a:array - a 数组
     * @param b:array - b 数组
     * @return result:[] - 结果数组
     * 
     */
    function getResult(a,b){
      const res = a.map(a_item=>{
        const group_ids = a_item.group_id.split(',');
        b.forEach(b_item=>{
          const target = group_ids.includes(`${b_item.id}`);//判断group_ids是否包含 b 数组的 id
          if(target) a_item.name = a_item.name?`${a_item.name}-${b_item.name}`:`${b_item.name}`//如果存在就处理对应逻辑
        })
        return a_item;
      })
      return res;
    }
    const res = getResult(a,b)
    console.log(res)

不是很明白?是这样的吗?

let A_list = [
    {
        "id":4,
        "u_id":1,
        "group_id":"1,3,5,6,8"
    },
    {
        "id":5,
        "u_id":3,
        "group_id":"1,2,4"
    }
]

let B_list = [
    {
        "id":8,
        "name":"群H"
    },
    {
        "id":4,
        "name":"群D"
    }
]


;(function(arr,brr){

    arr.forEach(item => {
        let res = item.group_id.split(',')
        
        brr.forEach(j => {
        
        if(res.includes(j.id.toString())) {
        
            console.log(j.name)
        }
    })

})


}(A_list,B_list))

使用模型关系就可以了:

A::with('bInfo')->findALL();

A模型

class A extends Model{
   CONST TABLE = 'A';
   
   // 定义 A 表和 B表 关系
   public function bInfo(){
        return $this->hasIn('group_id',B::class,'id');
   }
}

欢迎使用one框架

宣传栏