我是 TypeOrm 的新手,我正在尝试使用内部联接,但文档没有解释它,所以我有一个例子:
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;
@ManyToOne(type => User, user => user.photos)
user: User;
}
如果您想使用 INNER JOIN 而不是 LEFT JOIN,只需使用
innerJoinAndSelect
即可:
const user = await createQueryBuilder("user")
.innerJoinAndSelect("user.photos", "photo", "photo.isRemoved = :isRemoved", { isRemoved: false })
.where("user.name = :name", { name: "Timber" })
.getOne();
这将生成:
SELECT user.*, photo.* FROM users user
INNER JOIN photos photo ON photo.user = user.id AND photo.isRemoved = FALSE
WHERE user.name = 'Timber'
有人可以更详细地向我解释它是如何运作的吗?例如,我不知道第一个(“用户”)指的是什么,我的意思是,它是一列吗?如果我需要在列之间使用它,它会如何变化? 另外,
innerJoinAndSelect
的解释是什么,为什么它有3个值,TypeORM语法中的值是如何定义的?
当它使用 :name 并在 {name: "Timber"} 之后,该对象正在定义 :name?,最后如果我不想只获取一个并且我想从 table1 获取所有信息,会发生什么与 table2 匹配,因为实际上这就是我想做的。
对于第一个问题 createQueryBuilder 的参数在您的情况下是
user
,它是您在查询中使用的别名:
选择用户。,照片。来自用户用户 INNER JOIN 照片 照片 ON photo.user = user.id AND photo.isRemoved = FALSE 哪里 user.name = 'Timber'
const user =等待createQueryBuilder(“user”) .innerJoinAndSelect("user.photos", "照片", "photo.isRemoved = :isRemoved", { isRemoved: false }) .where("user.name = :name", { name: "Timber" }) .getOne();
第二个问题:第一个参数是您要加载的关系,第二个参数是您分配给该关系表的别名,第三个参数对于您添加的任何条件都是可选的
第四个问题,你应该使用
getMany()
而不是getOne();
我没听懂第三个问题。