Mat*_*ndt 11 mysql orm node.js typeorm
我刚刚开始使用 TypeORM,我正在努力使以下关系起作用:
User->Friends,而朋友也是用户对象。但是,我的 getter、getFriends 和 getFriendsInverse 正在工作;我现在想区分这两者。换句话说; 当我执行 mysql join 时,我不想对朋友进行左联接,而对 inverseFriends 进行另一个联接。
getter getFriends() 需要返回所有朋友,无论我在对象的“哪一边”。
那有意义吗?
这是我的模型定义:
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 = [];
Run Code Online (Sandbox Code Playgroud)
我希望有人理解我的问题 :D 谢谢马特
NoN*_*ded 20
你可以自我引用你的关系。这是一个简单的有向图的例子(也就是一个节点可以有一个父节点和多个子节点)。
@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[];
}
Run Code Online (Sandbox Code Playgroud)
要记住的一个重要注意事项是,当使用find*
函数从数据库读取对象时,这些关系不会自动加载。
要实际加载它们,您现在必须使用查询构建器并加入它们。(您可以加入多个级别。)示例:
let allServices = await this.repository.createQueryBuilder('category')
.andWhere('category.price IS NULL')
.innerJoinAndSelect('category.children', 'product')
.leftJoinAndSelect('product.children', 'addon')
.getMany();
Run Code Online (Sandbox Code Playgroud)
请注意,我是如何利用不同的名称来引用它们(category
,product
,和addon
)。
Jav*_*zán 13
我相信我迟到了三年,但比以往任何时候都晚了。获得最多支持的答案并没有回答这个问题,因为它只适用于树状和层次结构,所以如果你按照这个例子,就会发生这种情况:
Fred
/ \
Albert Laura
/ \
John Foo
Run Code Online (Sandbox Code Playgroud)
在此示例中,Foo
不能与 成为朋友Fred
,因为他只能有一个父母。朋友不是树结构,它就像一张网。答案如下:
Fred
/ \
Albert Laura
/ \
John Foo
Run Code Online (Sandbox Code Playgroud)
这将创建一个保存人与人之间关系的表。现在来说下一个重要的事情。如何查询并获取用户的好友?这并不像看起来那么容易,我已经玩了几个小时了,但无法使用 TypeORM 方法甚至查询生成器来完成它。答案是:原始查询。这将返回一个包含用户朋友的数组:
import { Column, Entity, JoinTable, ManyToMany, PrimaryGeneratedColumn } from 'typeorm';
@Entity(UserModel.MODEL_NAME)
export class UserModel {
static MODEL_NAME = 'users';
@PrimaryGeneratedColumn()
id?: number;
@Column({ type: 'varchar', unique: true, length: 50 })
username: string;
@Column({ type: 'varchar', length: 50, unique: true })
email: string;
@ManyToMany(type => UserModel)
@JoinTable()
friends: UserModel[];
@Column({ type: 'varchar', length: 300 })
password: string;
}
Run Code Online (Sandbox Code Playgroud)
(users_friends_users
是 typeORM 为保存用户之间关系的表自动生成的名称)
归档时间: |
|
查看次数: |
9778 次 |
最近记录: |