为 Objection.js 中关系的关系编写子查询

Writing a subquery for a relation's relation in Objection.js

我目前使用的是 2.2.15 版,我正在关注 relation 子查询 食谱。我已经概述了我的模型及其与底部的关系。

目前,我正在使用此查询获取事件及其 post 计数:

const events = await Event.query().select([
  'events.*',
  Event.relatedQuery('posts')
    .count()
    .as('numberOfPosts'),
  ]);

效果很好 - 但我如何计算每个活动的 post 用户的数量,即参加活动的用户总数。到目前为止,我已经尝试过使用 refs,但没有成功。

模型及其关系:

事件:

posts: {
  relation: Model.HasManyRelation,
  modelClass: Post,
  join: {
    from: 'events.id',
    to: 'posts.eventId',
  },
},

Post:

event: {
  relation: Model.BelongsToOneRelation,
  modelClass: Event,
  join: {
    from: 'posts.eventId',
    to: 'events.id',
  },
},
users: {
  relation: Model.ManyToManyRelation,
  modelClass: User,
  join: {
    from: 'posts.id',
    through: {
      // users_posts is the join table.
      from: 'users_posts.postId',
      to: 'users_posts.userId',
    },
    to: 'users.id',
  },
},

用户:

posts: {
  relation: Model.ManyToManyRelation,
  modelClass: Post,
  join: {
    from: 'users.id',
    through: {
      // users_posts is the join table.
      from: 'users_posts.userId',
      to: 'users_posts.postId',
    },
    to: 'posts.id',
  },
},

你应该可以这样做,我没有在代码中尝试过,所以你可能需要调整一些东西,如果我有一个需要跟踪的计数,我通常会做的是在 posts 上保留一个字段,在应用程序逻辑中增加用户,并且检索值的速度要快得多,在您的情况下,您可以只计算 postId 匹配的 users_posts 并得到您的 users 计数并保存在该字段中

const events = await Event.query().select([
   'events.*',
   Event.relatedQuery('posts')
   .count()
   .as('numberOfPosts'),

   Event.relatedQuery('posts')
   .join('users_posts', 'posts.id', '=', 'users_posts.postId')
   .join('users', 'users.id', '=', 'users_posts.userId')
   .countDistinct('users.id')
   .as('numberOfPostUsers'),
]);