创建查询构建器时如何避免重复代码?
How can I avoid duplicate code when I create a query builder?
早上好,我有订单服务。这里我有两个方法 find( findAll ) 和 findByKey( find all by keys ) 因为它是一个查询构建器,我需要加入其他表。
方法查找:
find(): Promise<Order[]> {
return this.orderRepository
.createQueryBuilder('order')
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
}
方法 findByKey:
findByKey(data: FindByKeyInput): Promise<Order[]> {
const { field, value } = data;
return this.orderRepository
.createQueryBuilder('order')
.where(`order.${field} = :${field}`, { [field]: value })
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
}
如何避免这种重复,我可以将这部分代码放入一个变量中并重复使用吗?谢谢!
您可以使用可选参数创建一个函数,例如:
find(data: FindByKeyInput = { field=null, value=null }): Promise<Order[]> {
const { field, value } = data;
let query = this.orderRepository
.createQueryBuilder('order') ;
if(field != null && value != null)
query.where(`order.${field} = :${field}`, { [field]: value });
query.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
return query
}
更新
做你想做的事,你可以创建一个函数 return querybuilder:
getOrderRepoWithRelations(){
return this.orderRepository
.createQueryBuilder('order')
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
}
然后您可以在您的函数中使用它,例如:
find(): Promise<Order[]> {
return this.getOrderRepoWithRelations()
.getMany();
}
findByKey(data: FindByKeyInput): Promise<Order[]> {
const { field, value } = data;
let query = this.getOrderRepoWithRelations();
return query
.where(`order.${field} = :${field}`, { [field]: value })
.getMany();
}
早上好,我有订单服务。这里我有两个方法 find( findAll ) 和 findByKey( find all by keys ) 因为它是一个查询构建器,我需要加入其他表。
方法查找:
find(): Promise<Order[]> {
return this.orderRepository
.createQueryBuilder('order')
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
}
方法 findByKey:
findByKey(data: FindByKeyInput): Promise<Order[]> {
const { field, value } = data;
return this.orderRepository
.createQueryBuilder('order')
.where(`order.${field} = :${field}`, { [field]: value })
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
}
如何避免这种重复,我可以将这部分代码放入一个变量中并重复使用吗?谢谢!
您可以使用可选参数创建一个函数,例如:
find(data: FindByKeyInput = { field=null, value=null }): Promise<Order[]> {
const { field, value } = data;
let query = this.orderRepository
.createQueryBuilder('order') ;
if(field != null && value != null)
query.where(`order.${field} = :${field}`, { [field]: value });
query.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
.getMany();
return query
}
更新
做你想做的事,你可以创建一个函数 return querybuilder:
getOrderRepoWithRelations(){
return this.orderRepository
.createQueryBuilder('order')
.leftJoinAndSelect('order.restaurant', 'restaurant')
.leftJoinAndSelect('order.user', 'media')
.leftJoinAndSelect('order.orderCustomer', 'orderCustomer')
.innerJoinAndSelect('order.orderCart', 'orderCart')
.leftJoinAndSelect('orderCart.product', 'product')
.leftJoinAndSelect('product.media', 'product_media')
.leftJoinAndSelect('order.orderPayment', 'orderPayment')
}
然后您可以在您的函数中使用它,例如:
find(): Promise<Order[]> {
return this.getOrderRepoWithRelations()
.getMany();
}
findByKey(data: FindByKeyInput): Promise<Order[]> {
const { field, value } = data;
let query = this.getOrderRepoWithRelations();
return query
.where(`order.${field} = :${field}`, { [field]: value })
.getMany();
}