Сущности представлений (View Entities)
Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →
Что такое ViewEntity?
ViewEntity — это класс, который отображается на представление базы данных.
Чтобы создать сущность представления, определите новый класс и пометьте его декоратором @ViewEntity():
@ViewEntity() принимает следующие параметры:
-
name- имя представления. Если не указано, генерируется из имени класса сущности. -
database- имя базы данных на выбранном сервере БД. -
schema- имя схемы. -
expression- определение представления. Обязательный параметр. -
dependsOn- список других представлений, от которых зависит текущее. Если ваше представление использует другое представление в своём определении, можно добавить его здесь для корректной генерации миграций в правильном порядке.
expression может быть строкой с правильно экранированными столбцами и таблицами (для примера — Postgres):
@ViewEntity({
expression: `
SELECT "post"."id" AS "id", "post"."name" AS "name", "category"."name" AS "categoryName"
FROM "post" "post"
LEFT JOIN "category" "category" ON "post"."categoryId" = "category"."id"
`
})
или экземпляром QueryBuilder
@ViewEntity({
expression: (dataSource: DataSource) => dataSource
.createQueryBuilder()
.select("post.id", "id")
.addSelect("post.name", "name")
.addSelect("category.name", "categoryName")
.from(Post, "post")
.leftJoin(Category, "category", "category.id = post.categoryId")
})
Примечание: привязка параметров не поддерживается из-за ограничений драйверов. Используйте литеральные параметры.
@ViewEntity({
expression: (dataSource: DataSource) => dataSource
.createQueryBuilder()
.select("post.id", "id")
.addSelect("post.name", "name")
.addSelect("category.name", "categoryName")
.from(Post, "post")
.leftJoin(Category, "category", "category.id = post.categoryId")
.where("category.name = :name", { name: "Cars" }) // <-- this is wrong
.where("category.name = 'Cars'") // <-- and this is right
})
Каждая сущность представления должна быть зарегистрирована в настройках источника данных:
import { DataSource } from "typeorm"
import { UserView } from "./entities/UserView"
const dataSource = new DataSource({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
entities: [UserView],
})
Столбцы сущности представления
Для корректного отображения данных из представления в столбцы сущности пометьте столбцы декоратором @ViewColumn()
и укажите их как алиасы в SELECT-выражении.
пример с определением в виде строки:
import { ViewEntity, ViewColumn } from "typeorm"
@ViewEntity({
expression: `
SELECT "post"."id" AS "id", "post"."name" AS "name", "category"."name" AS "categoryName"
FROM "post" "post"
LEFT JOIN "category" "category" ON "post"."categoryId" = "category"."id"
`,
})
export class PostCategory {
@ViewColumn()
id: number
@ViewColumn()
name: string
@ViewColumn()
categoryName: string
}
пример с использованием QueryBuilder:
import { ViewEntity, ViewColumn } from "typeorm"
@ViewEntity({
expression: (dataSource: DataSource) =>
dataSource
.createQueryBuilder()
.select("post.id", "id")
.addSelect("post.name", "name")
.addSelect("category.name", "categoryName")
.from(Post, "post")
.leftJoin(Category, "category", "category.id = post.categoryId"),
})
export class PostCategory {
@ViewColumn()
id: number
@ViewColumn()
name: string
@ViewColumn()
categoryName: string
}
Параметры столбцов представления
Параметры столбцов представления определяют дополнительные настройки, аналогично параметрам столбцов для обычных сущностей.
Параметры можно указать в @ViewColumn:
@ViewColumn({
name: "postName",
// ...
})
name: string;
Доступные параметры в ViewColumnOptions:
-
name: string- имя столбца в представлении базы данных. -
transformer: { from(value: DatabaseType): EntityType, to(value: EntityType): DatabaseType }- используется для преобразования свойств произвольного типаDatabaseType(поддерживаемого БД) в типEntityType. Поддерживаются массивы преобразователей, применяемые в обратном порядке при чтении. Поскольку представления доступны только для чтения,transformer.to(value)никогда не используется.