TypeORM Postgres фильтр по количеству отношений - PullRequest
0 голосов
/ 04 мая 2020

контекст У меня есть коллекция пользователей и коллекция рецептов, отношение ManyToMany между ними

Я новичок в этой структуре, и мне интересно, как я могу выполнить следующий запрос: подсчитать пользователей с как минимум один рецепт подсчитывает пользователей без каких-либо рецептов

Я обнаружил, что loadRelationCountAndMap очень полезен при подсчете количества рецептов у пользователя, но я не могу отфильтровать общий ответ в соответствии с этим свойством. Я пробовал это:

const users_without_recipes = await getRepository(User)
                .createQueryBuilder('user')
                .addSelect(['user.createdAt', 'user.email'])
                .loadRelationCountAndMap('user.recipes_count', 'user.recipes')
                .where('user.recipes_count = :count', {count: 0})
                .getManyAndCount();

также пытался использовать postgres array_count, но не уверен, как интегрировать его с фреймворком typeORM, и помощь очень ценится

1 Ответ

1 голос
/ 24 июня 2020

Я сам наткнулся на эту проблему. Мне очень нравится несколько источников, которые могут помочь вам найти решение. Ваша основная проблема носит более общий характер. Если вы включите ведение журнала, вы, вероятно, увидите сообщение об ошибке, например:
Ошибка в столбце «пользователь». «Recipes_count» не существует
Проблема в том, что вы пытаетесь использовать псевдоним. Этот вопрос касается этой проблемы: Использование псевдонима в предложении WHERE

Надеюсь, вы добьетесь большего успеха, чем я, но я решил использовать обходной путь после проб и ошибок журнала. Я уверен, что есть способ получше. Если вам удастся его найти, дайте мне знать.
(Если вы хотите вернуть список пользовательских объектов, без свойства user.recipes_count , включите последний .map тоже.)

const users_without_recipes =  await getRepository(User)
.createQueryBuilder('user')
.loadRelationCountAndMap('user.recipes_count', 'user.recipes')
.getMany();

return users_without_recipes 
    .filter((user) => user['user.recipes_count'] === 0)
    .map(({recipes_count, ...otherProperties}) => otherProperties);
...