为 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'),
]);
我目前使用的是 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'),
]);