跳到主要内容

关联查询

关联关系的关联查询包括:

  • 嵌套查询(通过上述 指定查询字段的功能来查询关联字段)
  • 按照关联关系进行过滤

嵌套查询

嵌套查询允许从数据库中的多个表中读取相关数据 ,例如文章及其评论

通过 select 来指定查询结果中返回关联字段及其内部的特定字段。

返回关联模型的特定字段

const { data } = await models.post.list({
// 只查询必要的字段
select: {
_id: true,
title: true,
updatedAt: true,
comments: {
_id: true,
createdAt: true,
comment: true,
},
},
filter: {
where: {},
},
getCount: true, // 开启用来获取总数
});

// 返回查询到的数据列表 `records` 和 总数 `total
// 返回的内容明显是经过了数据库的过滤,只返回了_id, title, updatedAt三个字段
console.log(data);
// {
// records: [
// {
// _id: '9FSAHWM9VV',
// comments: [
// {
// createdAt: 1718096509916,
// comment: '11',
// _id: '9FSAJF3GLG',
// },
// ],
// title: 'Bonjour le Monde👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VU',
// comments: [],
// title: '你好,世界👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VT',
// comments: [],
// title: 'Hola Mundo 👋',
// updatedAt: 1718096503886,
// },
// {
// _id: '9FSAHWM9VS',
// comments: [],
// title: 'Hello World👋',
// updatedAt: 1718096503886,
// },
// ],
// }

按关系查询

为文章添加评论:

const { data } = await models.comment.create({
data: {
post: {
_id: "xxx", // 关联的文章 ID
},
comment: "文章写的很不错😄",
},
});

// 返回写入的评论数据 _id
console.log(data);
// { id: "7d8ff72c665eb6c30243b6313aa8539e"}

查询文章下的所有评论:

const { data } = await models.comment.list({
filter: {
where: {
post: {
$eq: "xxx", // 传入文章 ID
},
},
},
getCount: true, // 是否返回总数
});

// 返回查询到的评论数据和总数
console.log(data);
// {
// "records": [
// {
// "owner": "Anonymous(95fblM7nvPi01yQmYxBvBg)",
// "createdAt": 1717491698898,
// "createBy": "Anonymous(95fblM7nvPi01yQmYxBvBg)",
// "post": "e2764d2d665ecbc9024b058f1d6b33a4",
// "updateBy": "Anonymous(95fblM7nvPi01yQmYxBvBg)",
// "_openid": "95fblM7nvPi01yQmYxBvBg",
// "comment": "文章写的很好😄",
// "_id": "b787f7c3665ed7f20247f85409c36512",
// "updatedAt": 1717491698898
// }
// ],
// "total": 1
// }

按照关系过滤

下面的查询语句会过滤评论内容不为空的文章,使用了 relateWhere 来进行关联模型的筛选,使用select来选择返回的字段

const { data } = await models.post.list({
filter: {
relateWhere: {
comments: {
where: {
comment: {
$nempty: true,
},
},
},
},
where: {},
},
select: {
comments: {
comment: true,
},
$master: true,
},
});
console.log(data);

// {
// "records": [
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718267474142,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "11",
// "_id": "9G5TTNF8G8"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9G5MUV3RLC",
// "title": "",
// "body": "",
// "slug": "",
// "updatedAt": 1718267474142
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718263769729,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "",
// "_id": "9G5ESK0BP6"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9G5C0WQN26",
// "title": "你好,世界👋",
// "body": "31",
// "updatedAt": 1718264815088
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718263769729,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "1",
// "_id": "9G5C8CCE1N"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9G5C0WQN27",
// "title": "Bonjour le Monde👋",
// "body": "222",
// "slug": "111",
// "updatedAt": 1718263858534
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718263769729,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "222",
// "_id": "9G5C9SB840"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9G5C0WQN25",
// "title": "Hola Mundo 👋",
// "updatedAt": 1718263769729
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718100296618,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "11",
// "_id": "9FSLL6SU6L"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9FSLKTQHB9",
// "title": "Bonjour le Monde👋",
// "updatedAt": 1718100296618
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718099611319,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "2222",
// "_id": "9FSJUCDH2G"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9FSJS16Z1A",
// "title": "11",
// "body": "11",
// "slug": "11",
// "updatedAt": 1718099611319
// },
// {
// "owner": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "createdAt": 1718096503886,
// "createBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "comments": [
// {
// "comment": "11",
// "_id": "9FSAJF3GLG"
// }
// ],
// "updateBy": "Anonymous(VEVVny3JknjjDtpzzp2AAQ)",
// "_openid": "VEVVny3JknjjDtpzzp2AAQ",
// "_id": "9FSAHWM9VV",
// "title": "Bonjour le Monde👋",
// "updatedAt": 1718096503886
// }
// ]
// }