關聯表學習
文中程式碼並不是實際程式碼,虛擬碼不可直接執行。
功能:使用者 喜歡 文章
表
-
使用者表(users)
id username 唯一標識,沒有登入的可直接使用 _openid 使用者名稱 -
文章表(articles)
id title content 唯一標識 標題 內容 -
關聯表(relation)
index userId articleId 唯一索引 使用者 ID 文章 ID
使用者喜歡文章時,向 relation 新增一條資料,
使用者取消喜歡時,從 relation 刪除對應的資料。
需求
-
查詢文章列表,返回文章標題、喜歡人數、使用者是否喜歡
第一步:先查詢出文章列表
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, }) }) } 複製程式碼
-
查詢使用者喜歡的文章列表,返回文章標題、喜歡人數
第一步:查詢關聯表得到使用者喜歡的文章 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, }) }) } 複製程式碼
-
查詢文章詳情,返回文章標題、內容、喜歡人數、使用者是否喜歡
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, }) }) } 複製程式碼