Typeorm - использование подзапросов - PullRequest
0 голосов
/ 12 июля 2020

У меня есть 3 объекта в моей базе данных, мы можем представить эти 3 (я сохранил только важные столбцы)

User     

     @PrimaryColumn()
    nick: string

    @OneToMany(type => Connection, connection => connection.user)
    connections:Connection[] 

Connection 

    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(type => User,user => user.connections) 
    user: User;

    @ManyToOne(type => Stream) 
    stream: Stream;

Stream
    @PrimaryGeneratedColumn()
    id: number;

Я думаю, что у меня есть некоторые навыки построения запросов в типорме, но я застрял прямо сейчас при использовании подзапроса.

Что я хочу сделать? Присоединиться ко всем объектам пользователя в части объектов соединения (выберите несколько объектов соединения в качестве подзапроса => make leftJoin User-subquery => отфильтруйте результаты, чтобы получить соединения, которые не были найдены правой стороной (соединение), поэтому ID соединения равен NULL).

Что я пробовал?

let query = await connectionRepository
.createQueryBuilder('connection')
.subQuery()
.where("connection.id = :id",{id:1})
.select(['connection.id','connection.user AS nick'])
.getQuery();

const result = await userRepository.createQueryBuilder("user")
                .leftJoinAndSelect("user.permissions", '(' + query + ')')
                .where("user.nick = :nick")
                .andWhere(`(${query}).id is null`)
                .getMany();

Я также пытался использовать подзапрос без .getQuery (), но он все равно не сработал, я думаю, что могу написать подзапрос Ok, но тогда у меня проблема с его использованием во втором запросе (с атрибутами подзапроса et c.) Я также видел несколько примеров с лямбда-функции, но лямбда всегда была на первой позиции в leftJoin.

Спасибо за ответ :)

1 Ответ

1 голос
/ 15 июля 2020

Вам нужно что-то вроде этого:

const result = await userRepository.query(`
      SELECT user.* FROM user
      LEFT JOIN connection connection ON user.id = connection.user_id
      WHERE connection.user_id IS NULL
      AND connection.id = ?;
    `, [id])

Связанный вопрос: MYSQL Left Join, как выбрать значения NULL?

...