gpt4 book ai didi

mysql - 自引用多对多关系类型ORM

转载 作者:行者123 更新时间:2023-11-29 02:14:01 31 4
gpt4 key购买 nike

我刚开始使用 TypeORM,我正在努力让以下关系发挥作用:

User->Friends,而 Friend 也是一个用户对象。但是,我的 setter/getter getFriends 和 getFriendsInverse 正在工作;我现在确实想区分两者。换句话说;当我执行 mysql 连接时,我不想对 friends 进行左连接而对 inverseFriends 进行另一个连接。

getter getFriends() 需要返回所有 friend ,无论我在对象的哪“边”。

这有意义吗?

这是我的模型定义:

getFriends() {
// This method should also return inverseFriends;
// I do not want to return the concat version; this should
// happen on the database/orm level
// So I dont want: this.friends.concat(this.inverseFriends)
return this.friends;
}

@ManyToMany(type => User, user => user.friendsInverse, {
cascadeInsert: false,
cascadeUpdate: false,
})
@JoinTable()
friends = [];

@ManyToMany(type => User, user => user.friends, {
cascadeInsert: true,
cascadeUpdate: true,
cascadeRemove: false,
})
friendsInverse = [];

我希望有人能理解我的问题 :D谢谢马特

最佳答案

您可以 self 引用您的关系。这是一个简单的有向图示例(也就是一个 Node 可以有一个父 Node 和多个子 Node )。

@Entity()
export class Service extends BaseEntity {

@PrimaryGeneratedColumn()
id: number;

@Column()
@Index({ unique: true })
title: string;

@ManyToOne(type => Service, service => service.children)
parent: Service;

@OneToMany(type => Service, service => service.parent)
children: Service[];
}

需要牢记的重要一点是,当使用 find* 函数从数据库中读取对象时,这些关系不会自动加载。

要实际加载它们,您现在必须使用查询生成器并加入它们。 (您可以加入多个级别。)示例:

let allServices = await this.repository.createQueryBuilder('category')
.andWhere('category.price IS NULL')
.innerJoinAndSelect('category.children', 'product')
.leftJoinAndSelect('product.children', 'addon')
.getMany();

请注意我是如何使用不同的名称来引用它们的(categoryproductaddon)。

关于mysql - 自引用多对多关系类型ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747765/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com