Помогите профильтровать значения в бд
Всем привет. У меня есть сервер на nest(orm - sequelize). Я хочу сделать путь с необязательными query параметрами. У меня есть две таблицы tasks и themes. У одного задания может быть только одна тема, а у одной темы - много заданий. И, я хочу сделать эндпоинт типа: .../tasks?theme_title=IT, но чтобы параметр theme_title был необязательным. Т.е., если я его задаю - возвращаются задания с конкретной темой, если нет - то все задания. И, собственно, есть две проблемы. 1 - я не знаю, как сделать параметр для фильтрации в свойстве where необязательным. Т.е., если theme_title = undefined, запрос не фильтровался бы по полю theme. 2 - я не знаю, как лучше сделать само получение заданий для конкретной темы, потому что я вижу 2 варианта: находить конкретную тему по ее названию и потом брать у нее эти задания(по типу theme.tasks; этот вариант мне не очень нравится) или же каким-то образом фильтровать сами задания(по типу where: {theme: {title: theme_title}}). Но здесь у меня возникает ошибка "Некорректное значение theme".
Вот мои модели. Надеюсь, я объяснил все более менее понятно)
Задачи:
@Table({tableName: 'tasks'})
export class Task extends Model<Task, TaskCreationAttrs> {
@ApiProperty({example: 1})
@Column({type: DataType.INTEGER, unique: true, autoIncrement: true, primaryKey: true})
id: number;
@ApiProperty({example: 'Задачка про яблоки'})
@Column({type: DataType.STRING, allowNull: false})
title: string;
@ApiProperty({example: 'Текст задачки про яблоки'})
@Column({type: DataType.STRING, defaultValue: false})
text: string;
@ForeignKey(() => User)
@Column({type: DataType.INTEGER, allowNull: false})
user_id: number;
@BelongsTo(() => User)
author: () => User;
@ApiProperty({example: [Solution]})
@HasMany(() => Solution)
solutions: Solution[];
@ForeignKey(() => Theme)
@Column({type: DataType.INTEGER, allowNull: false})
theme_id: number;
@BelongsTo(() => Theme)
theme: Theme;
// @ApiProperty({example: Image[]})
// @HasMany(() => Image)
// images: Image[];
}
Темы:
@Table({tableName: 'themes'})
export class Theme extends Model<Theme, ThemeCreationAttrs> {
@ApiProperty({example: 1})
@Column({type: DataType.INTEGER, unique: true, autoIncrement: true, primaryKey: true})
id: number;
@ApiProperty({example: 'it'})
@Column({type: DataType.STRING, unique: true, allowNull: false})
title: string;
@HasMany(() => Task)
tasks: Task[];
}
Ответы (1 шт):
В общем, у меня более менее получилось сделать запрос, который выдает нужный мне результат.
async getAllTasks(query: FilterGetAllDto) {
const themeWhere = {};
if (query.theme) {
themeWhere['title'] = query.theme;
}
const tasks = await this.tasksRepository
.findAll({
include: [
{
model: User,
attributes: ['id', 'sn_uid', 'user_name'],
},
{
model: Theme,
where: themeWhere,
attributes: ['id', 'title'],
},
{
model: Tag,
attributes: ['id', 'title'],
},
{
model: Solution,
attributes: ['id', 'text'],
},
],
});
return tasks;
}