# 关联查询

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

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

# 嵌套查询

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

通过 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
//         }
//     ]
// }