typeorm: как выполнить запрос и левое соединение с определенными столбцами в левой таблице в качестве новых пар ключ-значение в результате?

#typescript #typeorm

Вопрос:

У меня есть следующие User OrganizationUser сущности и, связанные отношением «Один ко многим» и «Многие к одному»: одна строка в User может соответствовать многим строкам в OrganizationUser ; и несколько строк в OrganizationUser могут иметь одно и то же userId , указывая на одну уникальную строку в User :

Сущность User :

 @Entity()
class User extends BaseEntity {
  static validations = {
    name: [is.required(), is.maxLength(100)],
    email: [is.required(), is.email(), is.maxLength(200)],
  };

  @PrimaryGeneratedColumn()
  id: number;

  @Column('varchar')
  name: string;

  @Column('varchar')
  email: string;

  @OneToMany(
    () => OrganizationUser,
    organizationUser => organizationUser.user,
    {cascade: true}
  )
  organizationUser: OrganizationUser[]

}
 

Сущность OrganizationUsers :

 class OrganizationUser extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(
    () => Organization, 
    organization => organization.organizationUsers
  )
  organization: Organization;

  @Column('integer')
  organizationId: number;

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

  @Column('integer')
  userId: number;
  
  @Column('integer', {nullable: true})
  quota: number | null;

  @Column('integer', {nullable: true})
  used: number | null;

 

Теперь я могу использовать следующие методы, чтобы получить все строки, заданные organizationId :

   const org_users = await getRepository(OrganizationUser)
    .find({ organizationId : req.currentOrganization.id }); 
 

or:

   const org_users = await createQueryBuilder("OrganizationUser")
  .where("OrganizationUser.organizationId = :oid", { oid:  req.currentOrganization.id})
  .getMany();
 

and the results are:

     "org_users": [
        {
            "id": 1,
            "organizationId": 1,
            "userId": 1,
            "quota": 10,
            "used": 0
        },
        {
            "id": 2,
            "organizationId": 1,
            "userId": 10,
            "quota": 10,
            "used": 0
        },
         
       ...
 

However, I want to add a new key-value pare in the result:

     "org_users": [
        {
            "id": 1,
            "name": "Alice",  // newly added
            "organizationId": 1,
            "userId": 1,
            "quota": 10,
            "used": 0
        },
        {
            "id": 2,
            "name": "Bob",  // newly added
            "organizationId": 1,
            "userId": 10,
            "quota": 10,
            "used": 0
        },
         
       ...
 

How can I modify my typeorm query to achieve this goal?

UPDATE:
I tried:

   const org_users = await createQueryBuilder("OrganizationUser")
  .leftJoinAndSelect("OrganizationUser.user", "user", "OrganizationUser.userId = user.id")
  .addSelect(['user.name'])
  .where("OrganizationUser.organizationId = :oid", { oid:  req.currentOrganization.id})
  .getMany();
 

which gives:

     "org_users": [
        {
            "id": 1,
            "organizationId": 1,
            "userId": 1,
            "quota": 10,
            "used": 0,
            "user": {
                "id": 1,
                "name": "Alice",
                "email": "Alice@app",
                "uuid": "d152894b-5eca-46aa-ab96-bc39504045da",
                "createdAt": "2021-07-24T10:01:20.490Z",
                "updatedAt": "2021-07-24T10:01:20.490Z"
            }
        },
 

Which I do not like, because it is too much info.

Also I tried:

   const org_users = await createQueryBuilder("OrganizationUser")
  .leftJoinAndSelect("OrganizationUser.user", "user", "OrganizationUser.userId = user.id")
  .select(['OrganizationUser.userId', 'OrganizationUser.organizationId', 
           'OrganizationUser.used', 'OrganizationUser.quota', 'user.name']) 
  .where("OrganizationUser.organizationId = :oid", { oid:  req.currentOrganization.id})
  .getMany();
 

Which gives a result I can take:

     "org_users": [
        {
            "organizationId": 1,
            "userId": 1,
            "quota": 10,
            "used": 0,
            "user": {
                "name": "Alice"
            }
        },
 

However, it is too silly to do .select(['OrganizationUser.userId', 'OrganizationUser.organizationId', 'OrganizationUser.used', 'OrganizationUser.quota', 'user.name']) .

Такая одинокая линия. Что делать, если в другой ситуации мне нужно больше столбцов как из основной таблицы, так и из левой таблицы?

Было бы безумием вручную записывать все имена столбцов.

Есть ли способ включить все столбцы в основную таблицу по умолчанию и указать нужные столбцы в левой таблице?