#node.js #typescript #orm #knex.js #bookshelf.js
#node.js #typescript #orm #knex.js #bookshelf.js
Вопрос:
Итак, в моем приложении у меня есть категории и статьи, которые взаимосвязаны. Сначала я извлекаю все категории, и внутри каждой из них есть статьи. Проблема в том, что я хочу фильтровать как категории, так и статьи внутри него, userId
но я не знаю, как это сделать, поскольку я использую TypeScript и получаю ошибку.
const articlesInCategories = (await (await ArticleCategory.fetchAll())
.query((qb: QueryBuilder) => {
qb.innerJoin(Table.ARTICLE_CATEGORY_RELATION, 'article_category_relation.category_id', 'article_category.id' );
qb.innerJoin(Table.ARTICLE, 'article.id', 'article_category_relation.article_id');
// Next condition is only for Categories not for Articles inside it
if (roleId == Role.manager) {
qb.where('user_id', userId);
}
qb.orderBy('id', 'desc');
})
.fetch({
withRelated: [{'articles': function (qb: QueryBuilder) => qb.where('user_id', userId)}]
}));
Если userId
, например, будет 1
, хотите получить только те категории, которые содержат статьи, написанные пользователем с идентификатором 1
. БОЛЕЕ того, не все статьи, а ТОЛЬКО написанные пользователем с id 1
.
У меня ошибка TS рядом withRelated
: Type '{ articles: (qb: QueryBuilder) => QueryBuilder<any, any[]>; }' is not assignable to type 'string'.ts(2322)
Можете ли вы помочь мне, пожалуйста, с TypeScript в таком случае или предложить какие-либо альтернативные способы достижения того, чего я хочу?
Ответ №1:
Ну, это был неправильный подход. Если я сделаю следующее, это сработает блестяще:
const articlesInCategories = await new ArticleCategory().query((qb: QueryBuilder) => {
.query((qb: QueryBuilder) => {
qb.innerJoin(Table.ARTICLE_CATEGORY_RELATION, 'article_category_relation.category_id', 'article_category.id' );
qb.innerJoin(Table.ARTICLE, 'article.id', 'article_category_relation.article_id');
if (roleId == Role.manager) {
qb.where('user_id', userId);
}
qb.orderBy('id', 'desc');
})
.fetch({
withRelated: [{ 'articles': (qb: QueryBuilder) => qb.where('user_id', userId) }]
}));