#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'])
.
Такая одинокая линия. Что делать, если в другой ситуации мне нужно больше столбцов как из основной таблицы, так и из левой таблицы?
Было бы безумием вручную записывать все имена столбцов.
Есть ли способ включить все столбцы в основную таблицу по умолчанию и указать нужные столбцы в левой таблице?