ГДЕ условие, основанное на массивах в typeorm

#sql #typescript #typeorm #node.js-typeorm

Вопрос:

Наличие заданного массива без максимальных элементов, таких как:

 ["DEFAULT", "NEW"], ["REVIEW", "OPEN"], ["DEFAULT", "IN PROGRESS"]
 

Как я могу сгенерировать запрос с помощью typeorm, например

 WHERE (tsk.category = DEFAULT AND tsk.status = NEW) OR (tsk.category = REVIEW AND tsk.status = OPEN) OR (tsk.category = DEFAULT and tsk.status = "IN PROGRESS")
 

Элегантным способом ? Могу ли я сделать что-то вроде query.andWhere(query.orWhere())

Мой код до сих пор:

 const categories = await categoryService.getAllCategories();
const statusMap = [];
for (const category of categories) {
    for (const state of category.states) {
        const key = Object.keys(state)[0];
        if (state[key].metaState === filter.meta_status) {
           statusMap.push([category.name, key]);
        }
    }
}
 

Ответ №1:

Вот решение, которое должно работать ( CategoryEntity является сущностью класса):

 const categories: CategoryEntity[] = await getManager()
      .createQueryBuilder(CategoryEntity, 'tsk')
      .where(new Brackets((qb) => qb.where('tsk.category = DEFAULT').andWhere('tsk.status = NEW')))
      .orWhere(new Brackets((qb) => qb.where('tsk.category = REVIEW').andWhere('tsk.status = OPEN')))
      .orWhere(new Brackets((qb) => qb.where('tsk.category = DEFAULT').andWhere('tsk.status = "IN PROGRESS"')))
      .getMany();
 

Дополнительные сведения о построителе запросов с WHERE предложением см. Здесь.