在删除 table 的同时在 Objection.js 中保留关系图
Keep a relation map in Objection.js while removing the table
我正在开发一个类似 reddit 的网站,其中投票存储每个用户(而不是每个 post)。这是我的相关架构:
内容
id | author_id | title | text
---|-----------|-------------|---
1 | 1 (adam) | First Post | This is a test post by adam
投票:任何人在任何post
上投过的所有票
id | voter_id | content_id | category_id
---|-------------|------------------|------------
1 | 1 (adam) | 1 ("First Post") | 1 (upvote)
2 | 2 (bob) | 1 ("First Post") | 1 (upvote)
vote_count:所有用户[=29] post 收到的总票数(“计数”) =]
id | content_id | category_id | count
---|------------------|--------------|-------
1 | 1 ("First Post") | 1 (upvote) | 2
我已经为 content
table:
定义了一个 voteCount
relation in Objection.js 模型
class Content extends Model {
static tableName = 'content';
static relationMappings = {
voteCount: {
relation: Model.HasManyRelation,
modelClass: VoteCount,
join: {
from: 'content.id',
to: 'vote_count.content_id'
}
}
}
}
但我最近(了解到并)决定我不需要保留(和更新)一个单独的 vote_count
table,而实际上我可以查询 vote
table 并且基本上得到相同的 table 作为结果:
SELECT content_id
, category_id
, COUNT(*) AS count
FROM vote
GROUP
BY content_id
, category_id
所以现在我想完全摆脱 vote_count
table。
但这似乎会破坏我的 voteCount
关系,因为不会有 VoteCount
模型(此处未显示,但它是 vote_count
的对应模型 table) 也没有了。 (对吗?)
如何在摆脱 vote_count
table 的同时保持 voteCount
关系(并因此 VoteCount
建立模型)?
有没有办法以某种方式在关系中指定而不是查看具体 table,它应该查看查询结果?或者是否可以为其定义一个模型 class?
如果有帮助,我在 PostgreSQL 中的基础数据库。
感谢@Belayer。视图正是这个问题的解决方案。
Objection.js supports 在模型 class 中使用视图(而不是 table),所以我所要做的就是根据上述查询创建一个视图.
我也在使用 Knex 的 migration strategy to create/version my database, and although it doesn't (yet) support 创建开箱即用的视图,我发现您可以只使用原始查询:
module.exports.up = async function(knex) {
await knex.raw(`
CREATE OR REPLACE VIEW "vote_count" AS (
SELECT content_id
, category_id
, COUNT(*) AS count
FROM vote
GROUP
BY content_id
, category_id
)
`);
};
module.exports.down = async function(knex) {
await knex.raw('DROP VIEW "vote_count";');
};
上述迁移步骤替换了我的 table vote_count
等效视图,Objection.js 模型 class (VoteCount
) 用作通常不需要任何更改,Content
class.
上的关系 voteCount
也是如此
我正在开发一个类似 reddit 的网站,其中投票存储每个用户(而不是每个 post)。这是我的相关架构:
内容
id | author_id | title | text ---|-----------|-------------|--- 1 | 1 (adam) | First Post | This is a test post by adam
投票:任何人在任何post
上投过的所有票id | voter_id | content_id | category_id ---|-------------|------------------|------------ 1 | 1 (adam) | 1 ("First Post") | 1 (upvote) 2 | 2 (bob) | 1 ("First Post") | 1 (upvote)
vote_count:所有用户[=29] post 收到的总票数(“计数”) =]
id | content_id | category_id | count ---|------------------|--------------|------- 1 | 1 ("First Post") | 1 (upvote) | 2
我已经为 content
table:
voteCount
relation in Objection.js 模型
class Content extends Model {
static tableName = 'content';
static relationMappings = {
voteCount: {
relation: Model.HasManyRelation,
modelClass: VoteCount,
join: {
from: 'content.id',
to: 'vote_count.content_id'
}
}
}
}
但我最近(了解到并)决定我不需要保留(和更新)一个单独的 vote_count
table,而实际上我可以查询 vote
table 并且基本上得到相同的 table 作为结果:
SELECT content_id
, category_id
, COUNT(*) AS count
FROM vote
GROUP
BY content_id
, category_id
所以现在我想完全摆脱 vote_count
table。
但这似乎会破坏我的 voteCount
关系,因为不会有 VoteCount
模型(此处未显示,但它是 vote_count
的对应模型 table) 也没有了。 (对吗?)
如何在摆脱 vote_count
table 的同时保持 voteCount
关系(并因此 VoteCount
建立模型)?
有没有办法以某种方式在关系中指定而不是查看具体 table,它应该查看查询结果?或者是否可以为其定义一个模型 class?
如果有帮助,我在 PostgreSQL 中的基础数据库。
感谢@Belayer。视图正是这个问题的解决方案。
Objection.js supports 在模型 class 中使用视图(而不是 table),所以我所要做的就是根据上述查询创建一个视图.
我也在使用 Knex 的 migration strategy to create/version my database, and although it doesn't (yet) support 创建开箱即用的视图,我发现您可以只使用原始查询:
module.exports.up = async function(knex) {
await knex.raw(`
CREATE OR REPLACE VIEW "vote_count" AS (
SELECT content_id
, category_id
, COUNT(*) AS count
FROM vote
GROUP
BY content_id
, category_id
)
`);
};
module.exports.down = async function(knex) {
await knex.raw('DROP VIEW "vote_count";');
};
上述迁移步骤替换了我的 table vote_count
等效视图,Objection.js 模型 class (VoteCount
) 用作通常不需要任何更改,Content
class.
voteCount
也是如此