Size: a a a

TypeORM - Русскоязычное сообщество

2021 March 03

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
Константин Брызгалин
когда нужно подгрузить связанные сущности из другой таблицы, или в чём вопрос?
если где то примеры использования более подробные?
источник

КБ

Константин Брызгалин... in TypeORM - Русскоязычное сообщество
Aleksey Lukyanov
если где то примеры использования более подробные?
частично описано в документации, а что-то можно по исходникам догнать… если вкратце то:

leftJoin просто подцепляет связь но ничего не селектит… например это можно использовать чтобы проверить отсутствие связанной сущности добавив where(‘related.id IS NULL’)
leftJoinAndSelect работает только с со связями описанными на модели – он берёт оттуда описание связи и кладёт связанную сущность только в это поле
leftJoinAndMapXXX связывают сущности не описанные на модели…

например есть user а есть post с userId. если я хочу чтобы у меня в выборке были user.publishedPosts, user.draftPosts и user.blockedPosts, то я могу сделать три leftJoinAndMapMany и указать по ним условия выборки из posts и для каждой указать в какой свойство их положить, а на User вообще эти поля не описывать, или просто описать без декораторов, просто чтобы указать тип Post[]
источник

КБ

Константин Брызгалин... in TypeORM - Русскоязычное сообщество
innerJoinXXX полностью аналогичны, только джойн другой. например выборка по условию наличия связанной сущности без выборки этой сущности – простой innerJoin без суффикса… записи базовой сущности, у которых нет связанных, в такую выборку не попадут…
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
Константин Брызгалин
частично описано в документации, а что-то можно по исходникам догнать… если вкратце то:

leftJoin просто подцепляет связь но ничего не селектит… например это можно использовать чтобы проверить отсутствие связанной сущности добавив where(‘related.id IS NULL’)
leftJoinAndSelect работает только с со связями описанными на модели – он берёт оттуда описание связи и кладёт связанную сущность только в это поле
leftJoinAndMapXXX связывают сущности не описанные на модели…

например есть user а есть post с userId. если я хочу чтобы у меня в выборке были user.publishedPosts, user.draftPosts и user.blockedPosts, то я могу сделать три leftJoinAndMapMany и указать по ним условия выборки из posts и для каждой указать в какой свойство их положить, а на User вообще эти поля не описывать, или просто описать без декораторов, просто чтобы указать тип Post[]
спасибо большое! Есть еще вопрос, касаемый именно leftJoinAndMapMany, я не могу понять что он принимает первым аргументом ("mapToProperty"). Не мог бы ты привести пример кода, можно твоего примера с юзерами и постами.
источник

A

Alexey in TypeORM - Русскоязычное сообщество
Aleksey Lukyanov
ну и еще, ты уверен что в самих таблицах в базе данных связи настроены? Создано поле "idType" и указано как foreign key в таблице materials?
по поводу idType у materials такого поля точно нет. есть поле type которое int.
источник

A

Alexey in TypeORM - Русскоязычное сообщество
и оно как foreign key
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
тогда и в сущности должно быть такое поле, а псевдоним связи измени например на materialType (что бы не совпадало с именеи поля type, которое foreign key
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
Alexey
и оно как foreign key
и этот ключ ссылается на поле idType в таблице тайпс, верно?
источник

A

Alexey in TypeORM - Русскоязычное сообщество
Aleksey Lukyanov
и этот ключ ссылается на поле idType в таблице тайпс, верно?
lf
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
на будущее, удобнее когда имена полей праймари и форейн ки совпадают, т.е. форейн ки в первой таблице имеет такое же имя как праймари ки во второй таблице
источник

A

Alexey in TypeORM - Русскоязычное сообщество
Aleksey Lukyanov
тогда и в сущности должно быть такое поле, а псевдоним связи измени например на materialType (что бы не совпадало с именеи поля type, которое foreign key
вот так вот получается?
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
@JoinColumns({
     name: 'type'
})
materialType: MaterialType
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
и в запросе будет:
joinAndSelect('materials.materialType', 'mtype')
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
последняя строка на твоем скрине это псевдоним связи, то есть ты даешь связи псевдоним "materialType", и по этому псевдониму ты обращаешься к связанной таблице в джойне
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
а свойство name в @JoinColumn показывает имя ключа в таблице материалс (как ты сказал это "type")
источник

A

Alexey in TypeORM - Русскоязычное сообщество
большое спасибо за разъяснения. заработало
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
👍
источник

КБ

Константин Брызгалин... in TypeORM - Русскоязычное сообщество
Aleksey Lukyanov
спасибо большое! Есть еще вопрос, касаемый именно leftJoinAndMapMany, я не могу понять что он принимает первым аргументом ("mapToProperty"). Не мог бы ты привести пример кода, можно твоего примера с юзерами и постами.
mapToProperty – это как раз и есть имя свойства куда typeorm положит связанную сущность на базовой…

this.userRepository.createQueryBuilder(‘user’).where(‘id = :userId’, { userId: ‘xxx’ }).leftJoinAndMapMany(‘user.publishedPosts’, Post, ‘publishedPosts’, ‘publishedPosts.userId = user.id AND publishedPosts.status = :status’, { status: ‘PUBLISHED’ }).getMany()

сорри если не наглядно, набирал в телеграме… как-то так это выглядит… на User не должно быть описано отношения publishedPosts – это просто имя свойства, куда попадут связанные записи из выборки… но поскольку это тайпскрипт и типы надо бы хорошо описывать, я бы туда добавил простое свойство public publishedPosts: Post[]; без декораторов…
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
Константин Брызгалин
mapToProperty – это как раз и есть имя свойства куда typeorm положит связанную сущность на базовой…

this.userRepository.createQueryBuilder(‘user’).where(‘id = :userId’, { userId: ‘xxx’ }).leftJoinAndMapMany(‘user.publishedPosts’, Post, ‘publishedPosts’, ‘publishedPosts.userId = user.id AND publishedPosts.status = :status’, { status: ‘PUBLISHED’ }).getMany()

сорри если не наглядно, набирал в телеграме… как-то так это выглядит… на User не должно быть описано отношения publishedPosts – это просто имя свойства, куда попадут связанные записи из выборки… но поскольку это тайпскрипт и типы надо бы хорошо описывать, я бы туда добавил простое свойство public publishedPosts: Post[]; без декораторов…
спасибо за объяснение, буду пробовать!
источник

AL

Aleksey Lukyanov in TypeORM - Русскоязычное сообщество
@constb вы использовали leftJoinAndMapMany с поздапросами? Когда вторым аргументов передается функция возвращающая подзапрос
источник