小程式雲開發關聯表(集合)學習

Honye發表於2018-09-26

關聯表學習

文中程式碼並不是實際程式碼,虛擬碼不可直接執行。

功能:使用者 喜歡 文章

  1. 使用者表(users)

    id username
    唯一標識,沒有登入的可直接使用 _openid 使用者名稱
  2. 文章表(articles)

    id title content
    唯一標識 標題 內容
  3. 關聯表(relation)

    index userId articleId
    唯一索引 使用者 ID 文章 ID

使用者喜歡文章時,向 relation 新增一條資料,

使用者取消喜歡時,從 relation 刪除對應的資料。

需求

  1. 查詢文章列表,返回文章標題、喜歡人數、使用者是否喜歡

    第一步:先查詢出文章列表

    select * from articles
    複製程式碼

    第二步:遍歷文章列表,查詢關聯表得到使用者是否喜歡、喜歡人數

    for (article : articles) {
        isLike = ( select * from relation where articleId = article.id && userId = 'userId' )
        likeCount = ( select count(*) from relation where articleId = article.id )
        article.isLike = isLike
        article.likeCount = likeCount
    }
    複製程式碼
    const db = cloud.database()
    
    const getArticles = async (event, context) => {
        const { userInfo: { openId } } = event
        return db.collection('articles').get().then(({ data }) => {
            let articles = []
            for (let i = 0, length = data.length; i < length; ++i) {
                await Promise.all([
                    db.collection('relation').where({
                        articleId: data[i].id,
                    }).count(),
                    db.collection('relation').where({
                        articleId: data[i].id,
                        userId: openId,
                    }).count()
                ]).then(([likeCount, liked]) => {
                    articles.push({
                        ...data[i],
                        likeCount,
                        liked: !!liked,
                    })
                })
            }
            return {
                data: articles,
                message: 'success',
            }
        }).catch( err => {
            console.error(err.errMsg)
            return Promise.reject({
                data: [],
                message: err.errMsg,
            })
        })
    }
    複製程式碼
  2. 查詢使用者喜歡的文章列表,返回文章標題、喜歡人數

    第一步:查詢關聯表得到使用者喜歡的文章 ID 陣列

    select articleId from relation where userId = 'userId'
    複製程式碼

    第二步:遍歷文章 ID 陣列,查詢文章表得到標題

    res = [] // 最終結果
    for (id : articleIds) {
        details = ( select * from articles where articleId = id )
        likeCount = ( select count(*) from relation where articleId = id )
        res.push({
            articleId: id,
            title: details.title,
            likeCount: likeCount,
        })
    }
    複製程式碼
    const db = cloud.database()
    const _ = db.command
    
    const getFavArticles = async (event, context) => {
        const { userInfo: { openId } } = event
        return db.collection('relation').where({
            userId: openId,
        }).field({
            articleId: true,
        }).get().then(({ data }) => {
            return db.collection('articles').where({
                id: _in(data.map( item => item.articleId )),
            }).then(({ data: articles }) => {
                let result = []
                for (let i = 0, length = articles.length; i < length; ++i) {
                	await db.collection('relation').where({
                        articleId: articles[i].id,
                    }).count().then(({ total }) => {
                        result.push({
                            ...articles,
                            likeCount: total,
                        })
                    })
            	}
                return {
                    data: result,
                    message: 'success',
                }
            })
        }).catch( err => {
            console.error(err)
            return Promise.reject({
                data: [],
                message: err.errMsg,
            })
        })
    }
    複製程式碼
  3. 查詢文章詳情,返回文章標題、內容、喜歡人數、使用者是否喜歡

    select title, content, likeCount from articles
    select count(*) from relation where articleId = 'articleId' && userId = 'userId'
    複製程式碼
    const db = cloud.database()
    
    const getArticleDetails = (event, context) => {
        const { userInfo: { openId }, id } = event
        return Promise.all([
            // 如果直接使用微信自帶的 _id 索引可直接使用
            // db.collection('articles').doc(id)
            db.collection('articles').where({ id }),
            db.collection('relation').where({
                userId: openId,
                articleId: id,
            }).count()
        ]).then(([details, total]) => {
            // 注意使用 where 查詢後這裡的 details 是個陣列
            if (details.length) {
                return {
                    data: {
                        ...details[0],
                        liked: !!total,
                    },
                    message: 'success',
                }
            }
        }).catch( err => {
            console.error(err)
            return Promise.reject({
                data: {},
                message: err.errMsg,
            })
        })
    }
    複製程式碼

小程式地址

相關文章