Size: a a a

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

2020 February 14

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Всем привет
Есть вопрос по typeorm, может кто в курсе?
делаю запрос к базе такой
this.createQueryBuilder('licenses')
   .innerJoinAndSelect(
     LicensedDeviceEntity,
     'ld',
     'ld.device_guid = :deviceGuid',
     { deviceGuid },
   )
   .getOne();

Сам запрос отправляется правильный, но в результат почему-то не попадают данные из LicensedDeviceEntity
С чем это может быть связано?
источник

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
т.е. функция возвращает данные только для licenses
источник

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Переписал вот так
this.createQueryBuilder('licenses')
   .innerJoinAndMapOne(
     'licenses.licensedDevices',
     'licensed_devices',
     'ld',
     '"ld"."licenseId" = licenses.id',
   )
   .where('ld.device_guid = :deviceGuid', { deviceGuid })
   .getOne();

Такая же история
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
@daydark по-моему ты выбираешь связку грубо говоря «не с той стороны». смотри, ты берёшь по гуиду девайса, но ищешь license а потом связываешь с девайсом и фильтруешь по нему. не лучше ли описать связь с license на девайсе, а потом сделать выборку *девайса* и указать что нужно вместе с ним выбрать и лицензию?
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
это можно вообще сделать с findOne. указать в where { device_guid: ‘xxx’ } а в relation – поле связи на энтити девайса…
источник

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Константин, спасибо за совет. А не получится так, что если переписать через девайс, то поля лицензии также не отобразятся?
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
на мой субъективный взгляд join-ы в билдере мутноваты в плане нейминга. если сделать ⌘-click (ctrl-click в винде) на методе, его комментарии проливают немного света на то что он делает, но мне полностью понять помогло только чтение исходников…
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
Egor Zholnin
Константин, спасибо за совет. А не получится так, что если переписать через девайс, то поля лицензии также не отобразятся?
вообще find использует left join, так что если например поле энтити называется license, то для девайса без лицензии license будет null
источник

КБ

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

КБ

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

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Константин Брызгалин
иначе там будет энтити License, для этого надо в @OneToMany указать тип – орм по нему определяет какую таблицу джойнить и по какому полю связывать…
Ну для девайсов у меня такая реляция
@ManyToOne(type => LicenseEntity, (licenseEntity: LicenseEntity) => licenseEntity.licensedDevices)
 @JoinTable()
 license: LicenseEntity;

Указать тип - это первый параметр?
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
JoinTable тут не к месту…
источник

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
во-первых в ManyToOne/OneToMany – это JoinColumn
источник

КБ

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

КБ

Константин Брызгалин in TypeORM - Русскоязычное сообщество
если не использовать «синхронизацию» это по-моему необязательно. а если это поле нужно на энтити в явном виде, его лучше объявить отдельно с @Column
источник

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Блин
А я тут наворотил)
Спасибо еще раз за помощь
источник

BK

Bogdan Korenkov in TypeORM - Русскоязычное сообщество
всех с праздником! не подскажите как мне создать БД в mysql автоматом при коннекте? Хочу тестовую делать базу, могу конечно через консоль создать, но думал может можно как-то автоматом ее делать как синхронизация
источник

EZ

Egor Zholnin in TypeORM - Русскоязычное сообщество
Bogdan Korenkov
всех с праздником! не подскажите как мне создать БД в mysql автоматом при коннекте? Хочу тестовую делать базу, могу конечно через консоль создать, но думал может можно как-то автоматом ее делать как синхронизация
Привет
Нужно почитать про миграции
источник

BK

Bogdan Korenkov in TypeORM - Русскоязычное сообщество
Ну я нашел пару вариантов
connection.query("CREATE DATABASE IF NOT EXISTS");

или в консоли typeorm query
источник

BK

Bogdan Korenkov in TypeORM - Русскоязычное сообщество
короче, без телодвижений никак?
источник