gpt4 book ai didi

javascript - 如何在查询中从表中获取属性?

转载 作者:行者123 更新时间:2023-12-03 02:19:55 25 4
gpt4 key购买 nike

我正在制作一个简单的购物车。我有一个购物车模型、一个产品模型和一个直通表 CartItems。这些是协会:

models.Cart.belongsToMany(models.Product, { through: 'CartItems', as: 'items' })
models.Product.belongsToMany(models.Cart, { through: "CartItems" });

这些是模型的定义:

购物车型号

var Cart = sequelize.define('Cart', {
userId: {
allowNull: false,
type: Sequelize.INTEGER,
references: {
model: 'User',
key: 'id',
},
},
totalPrice: DataTypes.FLOAT
});

产品型号

var Product = sequelize.define('Product', {
code: DataTypes.STRING,
name: DataTypes.STRING,
price: DataTypes.FLOAT
});

购物车项目模型在此模型中,我添加了数量和价格属性,因为我在某处读到,最好能了解他们下订单时的价格历史记录。还有数量属性,因为我只想在添加另一个产品时更改数量,而不是添加另一行。

var CartItem = sequelize.define('CartItem', {
CartId: DataTypes.INTEGER,
ProductId: DataTypes.INTEGER,
quantity: DataTypes.INTEGER,
price: DataTypes.FLOAT
});

我知道这可能不是最好的方法,但即使我更改了实现,我也想知道:如何访问 through 表中的属性?

具体来说,我正在尝试对结帐功能执行以下操作:

Cart.prototype.checkout = async function () {
let cartItemArray = await this.getItems({
include: [{
model: Product,
through: {
attributes: ['quantity'],
}
}]
});
cartItemArray = cartItemArray.map((item) => {
return {
code: item.code,
price: item.price,
quantity: item.quantity
};
});
let total = getTotalPrice(cartItemArray);
return total;
};

最佳答案

首先,一些警告

警告 1. 您有一个 price字段都在您的 Product 中模型并在您的CartItem中模型。你确定你想要这个吗?在你尝试写 checkout() 时方法,当你这样做 item.price ,您想要获得以下哪个价格?我的直觉告诉我,您并不真的想要有两个字段,但如果您真的想要,请考虑重命名其中一个字段以避免歧义。

警告 2。您有 totalPrice在你的Cart型号...该字段是否应该跟踪相关产品的价格总和?如果是,那是一个坏主意,请完全删除该字段,并且每当您需要总和时,立即计算它,因为像这样保留重复数据很容易出错(您必须确保它们同步)。

<小时/>

错误1

您显式定义了联结表模型,即 CartItem ,使用以下代码:

var CartItem = sequelize.define('CartItem', { /* ... */ });

到目前为止一切顺利。但是当你定义多对多关系时,你犯了一个错误。您使用过through: "CartItems"但你应该使用through: "CartItem" 。实际上,这种情况下的最佳实践是直接引用模型,因为您已经拥有它:through: CartItem 。因此,Sequelize 最终忽略您的模型并自动创建连接表,而无需额外的字段 pricequantity .

<小时/>

错误2

在您尝试编写checkout()时你所做的方法:

this.getItems({
include: [{
model: Product,
through: {
attributes: ['quantity'],
}
}]
});

这没有道理。回想一下Item只是您为 Product 设置的别名。运行此代码会产生 SequelizeEagerLoadingError: Product is not associated to Product! .

相反,您可以简单地执行 this.getItems()根本没有任何参数。

<小时/>

错误3

接下来,您编写了代码:

return {
code: item.code,
price: item.price,
quantity: item.quantity
};

这表明您期望 quantity作为另一个领域与 code 一起出现。这是不正确的。 codeProduct 中的一个字段模型同时 quantityCartItem 中的一个字段模型。 Sequelize 不会像这样“扁平化”地检索它们。相反,关联本身的字段嵌套在查询结果中,如下所示:

{
"id": 1,
"code": null,
"name": "test",
"price": null,
"createdAt": "2018-03-11T19:11:12.862Z",
"updatedAt": "2018-03-11T19:11:12.862Z",
"CartItem": {
"CartId": 1,
"ProductId": 1,
"quantity": 2,
"price": 1.5,
"createdAt": "2018-03-11T19:11:13.047Z",
"updatedAt": "2018-03-11T19:11:13.047Z"
}
}

因此,而不是 item.quantity在那里,你应该使用 item.CartItem.quantity .

<小时/>

总结

标题中问题的答案“如何通过查询中的表获取属性?”只是“只需执行查询,即您的情况下的 this.getItems() ,因为属性默认情况下,来自通过表的结果”。

只是你犯了一些其他错误,当然,它不起作用。

关于javascript - 如何在查询中从表中获取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208717/

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