环回 4 - 字段中包含的 HasMany 关系
Loopback 4 - HasMany relation included in fields
我正在尝试使用新的 Loopback 4 框架设置 HasMany 关系。
我有以下型号:
import {Entity, model, property, belongsTo, hasMany} from
'@loopback/repository';
import {User} from "./user.model";
import {OrderProduct} from "./order-product.model";
@model({
name: 'sales_order'
})
export class Order extends Entity {
@property({
type: 'number',
id: true,
required: true,
})
id: number;
@property({
type: 'number',
required: true,
})
total_amount: number;
@belongsTo(() => User)
user_id: number;
@hasMany(() => OrderProduct, {keyTo: 'order_id'})
products?: OrderProduct[];
constructor(data?: Partial<Order>) {
super(data);
}
}
存储库如下:
import {DefaultCrudRepository, repository, HasManyRepositoryFactory, BelongsToAccessor} from '@loopback/repository';
import {Order, OrderProduct, User} from '../models';
import {DbDataSource} from '../datasources';
import {inject, Getter} from '@loopback/core';
import {OrderProductRepository} from "./order-product.repository";
import {UserRepository} from "./user.repository";
export class OrderRepository extends DefaultCrudRepository<
Order,
typeof Order.prototype.id
> {
public readonly user: BelongsToAccessor<
User,
typeof Order.prototype.id
>;
public readonly products: HasManyRepositoryFactory<
OrderProduct,
typeof Order.prototype.id
>;
constructor(
@inject('datasources.db') dataSource: DbDataSource,
@repository.getter(OrderProductRepository)
getOrderProductRepository: Getter<OrderProductRepository>,
@repository.getter('UserRepository')
userRepositoryGetter: Getter<UserRepository>,
) {
super(Order, dataSource);
this.products = this._createHasManyRepositoryFactoryFor(
'products',
getOrderProductRepository,
);
this.user = this._createBelongsToAccessorFor(
'user_id',
userRepositoryGetter,
);
}
}
例如,当我执行订单时,出现错误:500 error: column "products" does not exist
并且在进一步挖掘时,我可以看到 SQL 正在尝试检索字段 products
它只是一个关系。
如果我做错了什么,有人知道吗?
我正在使用 pg 作为数据库。
我认为这是 LoopBack 4 中的一个错误。当您用 @hasMany
装饰 class 属性 时,装饰器在底层定义了一个模型 属性。见 here:
export function hasMany<T extends Entity>(
targetResolver: EntityResolver<T>,
definition?: Partial<HasManyDefinition>,
) {
return function(decoratedTarget: Object, key: string) {
property.array(targetResolver)(decoratedTarget, key);
// ...
};
}
当连接器查询数据库时,它试图在查询中包含列 products
,因为它认为 products
是 属性.
问题已被 https://github.com/strongloop/loopback-next/issues/1909 跟踪,请考虑提出问题并加入讨论。
我正在尝试使用新的 Loopback 4 框架设置 HasMany 关系。 我有以下型号:
import {Entity, model, property, belongsTo, hasMany} from
'@loopback/repository';
import {User} from "./user.model";
import {OrderProduct} from "./order-product.model";
@model({
name: 'sales_order'
})
export class Order extends Entity {
@property({
type: 'number',
id: true,
required: true,
})
id: number;
@property({
type: 'number',
required: true,
})
total_amount: number;
@belongsTo(() => User)
user_id: number;
@hasMany(() => OrderProduct, {keyTo: 'order_id'})
products?: OrderProduct[];
constructor(data?: Partial<Order>) {
super(data);
}
}
存储库如下:
import {DefaultCrudRepository, repository, HasManyRepositoryFactory, BelongsToAccessor} from '@loopback/repository';
import {Order, OrderProduct, User} from '../models';
import {DbDataSource} from '../datasources';
import {inject, Getter} from '@loopback/core';
import {OrderProductRepository} from "./order-product.repository";
import {UserRepository} from "./user.repository";
export class OrderRepository extends DefaultCrudRepository<
Order,
typeof Order.prototype.id
> {
public readonly user: BelongsToAccessor<
User,
typeof Order.prototype.id
>;
public readonly products: HasManyRepositoryFactory<
OrderProduct,
typeof Order.prototype.id
>;
constructor(
@inject('datasources.db') dataSource: DbDataSource,
@repository.getter(OrderProductRepository)
getOrderProductRepository: Getter<OrderProductRepository>,
@repository.getter('UserRepository')
userRepositoryGetter: Getter<UserRepository>,
) {
super(Order, dataSource);
this.products = this._createHasManyRepositoryFactoryFor(
'products',
getOrderProductRepository,
);
this.user = this._createBelongsToAccessorFor(
'user_id',
userRepositoryGetter,
);
}
}
例如,当我执行订单时,出现错误:500 error: column "products" does not exist
并且在进一步挖掘时,我可以看到 SQL 正在尝试检索字段 products
它只是一个关系。
如果我做错了什么,有人知道吗?
我正在使用 pg 作为数据库。
我认为这是 LoopBack 4 中的一个错误。当您用 @hasMany
装饰 class 属性 时,装饰器在底层定义了一个模型 属性。见 here:
export function hasMany<T extends Entity>(
targetResolver: EntityResolver<T>,
definition?: Partial<HasManyDefinition>,
) {
return function(decoratedTarget: Object, key: string) {
property.array(targetResolver)(decoratedTarget, key);
// ...
};
}
当连接器查询数据库时,它试图在查询中包含列 products
,因为它认为 products
是 属性.
问题已被 https://github.com/strongloop/loopback-next/issues/1909 跟踪,请考虑提出问题并加入讨论。