【发布时间】:2018-08-17 08:42:16
【问题描述】:
我正在使用 typeorm v 0.1.14。
typeorm 似乎为多对一连接中的两个不同列生成了相同的别名。如果我在 @ManyToOne 装饰器中使用预先加载(例如,它使用存储库上的 .find() 方法加载子节点)或者我使用查询构建器功能加载关系,这并不重要。
下面是我可以重新创建的最简单的示例。
// SampleStatus entity/file:
import { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
@Entity({name: 'statuses', schema: 'master'})
export class SampleStatus {
@PrimaryGeneratedColumn()
public id: number;
}
// Sample entity that has a child statusimport { Entity, Column, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
import { SampleStatus } from './sample-status.entity';
@Entity({ name: 'samples', schema: 'master'})
export class Sample {
@PrimaryGeneratedColumn()
public id: number;
@Column()
public name: string;
@ManyToOne(type => SampleStatus, status => status.id, { eager: true })
public status: SampleStatus;
}
以最简单的方式使用上述实体: 让结果:样本[] | null = 等待 getRepository(Sample).find() || [];
这会生成以下记录的查询,由我格式化:
SELECT "Sample"."id" AS "Sample_id",
"Sample"."name" AS "Sample_name",
"Sample"."status_id" AS "Sample_status_id",
"Sample_status"."id" AS "Sample_status_id"
FROM "master"."samples" "Sample"
LEFT JOIN "master"."statuses" "Sample_status"
ON "Sample_status"."id"="Sample"."status_id"
注意这两个名称是如何生成的——它们都是相同的别名列名。
我正在使用我找到的这段代码,它将实体属性名称转换为蛇形大小写。这被传递到连接设置中。
import { DefaultNamingStrategy, NamingStrategyInterface } from "typeorm";
import { snakeCase } from 'typeorm/util/StringUtils'
export class SnakeCaseNamingStrategy extends DefaultNamingStrategy {
tableName(targetName: string, userSpecifiedName: string): string {
return userSpecifiedName ? userSpecifiedName : snakeCase(targetName);
}
columnName(propertyName: string, customName: string, embeddedPrefixes: string[]): string {
return snakeCase(embeddedPrefixes.concat(customName ? customName : propertyName).join("_"));
}
columnNameCustomized(customName: string): string {
return customName;
}
relationName(propertyName: string): string {
return snakeCase(propertyName);
}
joinTableName(firstTableName: string, secondTableName: string, firstPropertyName: string, secondPropertyName: string): string {
return `${snakeCase(firstTableName)}_${secondTableName}`;
}
}
虽然被拉回的值是相同的(因为它是一个连接列)并且在运行时不会真正引起问题,但我在获取记录的查询并将其转换为视图时注意到了这一点。 Postgres 抱怨列名重复。
有没有办法将第二个选择别名为不同的名称,或者根本不选择第二个值?
【问题讨论】:
标签: typescript postgresql-9.3 typeorm