如何 select 仅 single/multiple 来自 Typeorm 中加入实体的字段
How to select only single/multiple fields from joined entity in Typeorm
根据 TypeOrm 文档:https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#joining-relations
我们可以查询加入实体的字段,该字段会将其所有字段填充到响应中。我不确定如何只限制几个选定的字段(single/multiple),我尝试添加 'select([])' 但它在生成的 SQL 查询中不起作用我可以看到它正在查询所有字段。
代码:
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import {Photo} from "./Photo";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
}
import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm";
import {User} from "./User";
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column()
alt: string;
@ManyToOne(type => User, user => user.photos)
user: User;
}
在代码上:
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.where("user.name = :name", { name: "Timber" })
.getOne();
以上代码给出的输出为 -
{
id: 1,
name: "Timber",
photos: [{
id: 1,
url: "me-with-chakram.jpg",
alt: "Me With Chakram"
}, {
id: 2,
url: "me-with-trees.jpg",
alt: "Me With Trees"
}]
}
有没有一种方法我可以只查询 'url' 和 'alt' 所以输出看起来像这样 -
{
id: 1,
name: "Timber",
photos: [{
url: "me-with-chakram.jpg",
alt: "Me With Chakram"
}, {
url: "me-with-trees.jpg",
alt: "Me With Trees"
}]
}
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.select(['user', 'photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();
或
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.addSelect(['photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();
(不知道第二个)
给出的第一个答案是正确的(第二个答案不正确),所以,你必须站在“基础”实体但是,如果你不需要 all/any 用户您可以申请的领域
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.select(['user.id', 'photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();
根据 TypeOrm 文档:https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#joining-relations
我们可以查询加入实体的字段,该字段会将其所有字段填充到响应中。我不确定如何只限制几个选定的字段(single/multiple),我尝试添加 'select([])' 但它在生成的 SQL 查询中不起作用我可以看到它正在查询所有字段。
代码:
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import {Photo} from "./Photo";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
}
import {Entity, PrimaryGeneratedColumn, Column, ManyToOne} from "typeorm";
import {User} from "./User";
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column()
url: string;
@Column()
alt: string;
@ManyToOne(type => User, user => user.photos)
user: User;
}
在代码上:
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.where("user.name = :name", { name: "Timber" })
.getOne();
以上代码给出的输出为 -
{
id: 1,
name: "Timber",
photos: [{
id: 1,
url: "me-with-chakram.jpg",
alt: "Me With Chakram"
}, {
id: 2,
url: "me-with-trees.jpg",
alt: "Me With Trees"
}]
}
有没有一种方法我可以只查询 'url' 和 'alt' 所以输出看起来像这样 -
{
id: 1,
name: "Timber",
photos: [{
url: "me-with-chakram.jpg",
alt: "Me With Chakram"
}, {
url: "me-with-trees.jpg",
alt: "Me With Trees"
}]
}
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.select(['user', 'photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();
或
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.addSelect(['photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();
(不知道第二个)
const user = await createQueryBuilder("user")
.leftJoinAndSelect("user.photos", "photo")
.select(['user.id', 'photo.url', 'photo.alt'])
.where("user.name = :name", { name: "Timber" })
.getOne();