Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js TypeForm:与实体中定义的where子句的关系_Node.js_Typescript_Typeorm - Fatal编程技术网

Node.js TypeForm:与实体中定义的where子句的关系

Node.js TypeForm:与实体中定义的where子句的关系,node.js,typescript,typeorm,Node.js,Typescript,Typeorm,我想创建一个SalesOrder实体,该实体与同一实体具有2个OneToMany关系,但具有不同的条件 最终目标是检索如下地址: const salesforder=wait salesforder.findOne(1{ 关系:['receiverAddress','senderAddress'] }); console.log(salesOrder.receiverAddress) console.log(salesOrder.senderAddress) 我不知道如何在SalesOrder

我想创建一个SalesOrder实体,该实体与同一实体具有2个OneToMany关系,但具有不同的条件

最终目标是检索如下地址:

const salesforder=wait salesforder.findOne(1{
关系:['receiverAddress','senderAddress']
});
console.log(salesOrder.receiverAddress)
console.log(salesOrder.senderAddress)
我不知道如何在SalesOrder实体中按类型过滤地址关系

我想这样做:

//SalesOrder.ts
@实体()
导出类SalesOrder扩展BaseEntity{
@第()列
@PrimaryGeneratedColumn()
身份证号码
@OneToMany(SalesOrderAddress,SalesOrderAddress=>SalesOrderAddress{
其中:{
类型:'receiver'//连接条件salesOrderAddress.type='receiver'
}
})
收款人地址:SalesOrderAddress
@OneToMany(SalesOrderAddress,SalesOrderAddress=>SalesOrderAddress{
其中:{
类型:“发件人”//加入条件salesOrderAddress.type=“发件人”
}
})
发件人地址:SalesOrderAddress
}
问题:
其中
子句未在typeform decorators中处理

是否可以获得类似的结果(不使用查询生成器)


我知道我可以使用2个OneToOne关系,但这意味着SalesOrder数据库包含两个外键:receiverAddressId和senderAddressId。我更喜欢使用OneToMany关系,因为它允许在SalesOrderAddress(例如salesOrderId)上只有一个外键。

这只是一个例子,您可以对OneToMany执行相同的操作

import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, RelationId, ManyToOne } from 'typeorm';
import { Salons } from './Salons';

//TODO: Create Joins with other tables after creating them.
@Entity({name: 'products'})
export class Products{

    @PrimaryGeneratedColumn()
    id: number | undefined;

    @Column({type: 'varchar'})
    name: string | undefined;

    @ManyToOne(type => Salons, salons => salons.products)
    salons: Salons | undefined;

    @Column({type: 'int'})
    @RelationId((products: Products) => products.salons)
    salons_id: number | undefined;
}

在您的情况下,我会考虑创建自定义方法来获得期望的信息。检查该示例:

从'typeorm'导入{BaseEntity,Entity,PrimaryGeneratedColumn,Column,OneToMany,manytone};
@实体({name:'Address'})
导出类地址扩展BaseEntity{
@PrimaryGeneratedColumn({type:'int'})
id:编号;
@列({type:'varchar',长度:20})
类型:“接收者”|“发送者”;
@列({type:'nvarchar',长度:1024})
值:字符串;
//放置将此实体连接到SalesOrder的道具
@多通(销售订单,参考=>参考地址)
销售订单:销售订单;
}
@实体({name:'salesforder'})
导出类SalesOrder扩展BaseEntity{
@PrimaryGeneratedColumn({type:'int'})
id:编号;
//放置将此实体连接到地址的道具
@OneToMany(地址,ref=>ref.salesOrder)
地址:地址【】;;
//创建要筛选的泛型方法
私有静态getTypeAddresses(id:number,类型:'receiver'|'sender'):承诺{
如果(id的类型!=='number'){
抛出新错误(“实体的id必须是数字”);
}
回信地址
.createQueryBuilder('地址')
.选择(['地址'])
.innerJoin(
“地址.销售订单”,
“销售订单”,
'SalesOrder.id=:id',
{id:id}
)
.在哪里(
'类型=:类型',
{type}
)
.getMany();
}
//稍后,创建方法以轻松获取您的地址
静态getReceiverAddresses(id:number):承诺{
返回SalesOrder.getTypeAddresses(id为“receiver”);
}
静态getSenderAddresses(id:number):承诺{
返回SalesOrder.getTypeAddresses(id为“发件人”);
}
getReceiverAddresses():承诺{
返回SalesOrder.getTypeAddresses(this.id,'receiver');
}
getSenderAddresses():承诺{
返回SalesOrder.getTypeAddresses(this.id,'sender');
}
}
用法示例:

constSalesOrder=wait salesOrder.findOne({id:1});
log(wait salesforder.getReceiverAddresses());
log(等待salesOrder.getSenderAddresses());

如果您不想向实体类添加方法,请考虑创建控制器类或其他更方便的过程。例如:

从'typeorm'导入{BaseEntity,Entity,PrimaryGeneratedColumn,Column,OneToMany,manytone};
@实体({name:'Address'})
导出类地址扩展BaseEntity{
@PrimaryGeneratedColumn({type:'int'})
id:编号;
@列({type:'varchar',长度:20})
类型:“接收者”|“发送者”;
@列({type:'nvarchar',长度:1024})
值:字符串;
//放置将此实体连接到SalesOrder的道具
@多通(销售订单,参考=>参考地址)
销售订单:销售订单;
}
@实体({name:'salesforder'})
导出类SalesOrder扩展BaseEntity{
@PrimaryGeneratedColumn({type:'int'})
id:编号;
//放置将此实体连接到地址的道具
@OneToMany(地址,ref=>ref.salesOrder)
地址:地址【】;;
}
导出类SalesOrderCtrl扩展SalesOrder{
私有静态getTypeAddresses(id:number,类型:'receiver'|'sender'):承诺{
如果(id的类型!=='number'){
抛出新错误(“实体的id必须是数字”);
}
回信地址
.createQueryBuilder('地址')
.选择(['地址'])
.innerJoin(
“地址.销售订单”,
“销售订单”,
'SalesOrder.id=:id',
{id:id}
)
.在哪里(
'类型=:类型',
{type}
)
.getMany();
}
静态getReceiverAddresses(id:number):承诺{
返回SalesOrder.getTypeAddresses(id为“receiver”);
}
静态getSenderAddresses(id:number):承诺{
返回SalesOrder.getTypeAddresses(id为“发件人”);
}
getReceiverAddresses():承诺{
返回SalesOrder.getTypeAddresses(this.id,'receiver');
}
getSenderAddresses():承诺{
返回SalesOrder.getTypeAddresses(this.id,'sender');
}
}
用法示例:

constSalesOrder=await-SalesOrderCtrl.findOne({id:1});
log(wait salesforder.getReceiverAddresses());
log(等待salesOrder.getSenderAddresses());

抱歉,我看不出您在多通关系中的where条件(或等效条件)应该放在哪里。我已经知道怎么做了