uni-app中在单个主表+多个副表+不同副表在主表中有不同外键的情况下,如何实现多表联查?

发布于 1周前 作者 gougou168 来自 uni-app

uni-app中在单个主表+多个副表+不同副表在主表中有不同外键的情况下,如何实现多表联查?

文章与多表联查问题

现状:我现在有一个文章表,一个用户表,一个分类表。我需要在展示文章的同时,展示该文章的作者(用户)以及该文章所属的类别。

问题:我现在的写法是,使用JS库提供的JQL语法,先文章表(主表)与用户表(副表)使用外键用户id进行联表查询,然后文章表(主表)与分类表(副表)使用外键类别id进行联表查询。然而,这样不仅写起来麻烦,这一思路对我而言也很难应用到现成框架中,因为现成框架通常使用unicloud-db组件进行查询,而我对unicloud-db和JQL语法的混用非常不熟练。我想知道如何简洁的实现在单个主表+多个副表+不同副表在主表中有不同外键的情况下,实现多表联查?(基于unicloud-db组件实现的方式和基于JS库提供的JQL语法,这两种方式都很需要)万分感谢!!!!!!


2 回复

JQL不支持多表联查。


在uni-app中处理单个主表与多个副表,且不同副表在主表中有不同外键的情况下,可以通过使用云函数或后端接口进行多表联查。这里我们假设你使用的是云开发环境(如阿里云、腾讯云或uniCloud)来实现多表联查。以下是一个基于uniCloud的示例代码。

1. 数据库设计

假设我们有以下三张表:

  • main_table (主表)
  • sub_table1 (副表1)
  • sub_table2 (副表2)

其中,sub_table1通过main_id字段关联到main_tablesub_table2通过main_record_id字段关联到main_table

2. 云函数实现多表联查

在云函数中,我们可以使用数据库的聚合查询来实现多表联查。以下是一个基于uniCloud云函数的示例代码:

// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
const db = cloud.database()

exports.main = async (event, context) => {
  const mainTableId = event.mainTableId // 从前端传入的主表ID

  try {
    const mainRecord = await db.collection('main_table')
      .doc(mainTableId)
      .get()

    if (!mainRecord.data) {
      return {
        success: false,
        message: 'Main record not found'
      }
    }

    const subTable1Records = await db.collection('sub_table1')
      .where({
        main_id: mainTableId
      })
      .get()

    const subTable2Records = await db.collection('sub_table2')
      .where({
        main_record_id: mainTableId
      })
      .get()

    return {
      success: true,
      data: {
        mainRecord: mainRecord.data[0],
        subTable1Records: subTable1Records.data,
        subTable2Records: subTable2Records.data
      }
    }
  } catch (error) {
    return {
      success: false,
      message: error.message
    }
  }
}

3. 前端调用云函数

在uni-app前端代码中,你可以通过调用云函数来获取联查结果:

uniCloud.callFunction({
  name: 'yourCloudFunctionName', // 云函数名称
  data: {
    mainTableId: 'your-main-table-id' // 主表ID
  },
  success: (res) => {
    if (res.result.success) {
      const { mainRecord, subTable1Records, subTable2Records } = res.result.data
      console.log('Main Record:', mainRecord)
      console.log('Sub Table 1 Records:', subTable1Records)
      console.log('Sub Table 2 Records:', subTable2Records)
    } else {
      console.error('Error:', res.result.message)
    }
  },
  fail: (err) => {
    console.error('Call Function Failed:', err)
  }
})

这个示例展示了如何在uni-app中通过云函数实现单个主表与多个副表的多表联查。你可以根据实际需求调整数据库查询条件和返回的数据结构。

回到顶部