我有一个名为 orders 的父表和一个名为 order_items 的子表。我需要获取客户的订单以及每个订单的相应订单项目。下面是架构:
订单:
Id | Order_date | Order_value
-------------------------------
1234 | 2016-12-12 | 700.00
订购项目:
Id | ProductId | OrderId
----------------------------
8847 | shirt_blue | 1234
8848 | shirt_red | 1234
我需要 JSON 的最终结果,如下所示:
{
id: '1234',
order_date: '2016-12-12',
order_value: 700.00,
Items: [
{id: '8847', productid: 'shirt_blue' },
{id: '8848', productid: 'shirt_red' }
]
}
从MySql获取这些记录的最干净,最快的方法是什么?我正在使用NodeJS/Node-MySql,如果它有任何区别的话。
目前,我首先获取订单记录,然后在应用程序层中循环访问它们,然后获取订单项记录并将其附加到每条记录中。这不是非常有效的做事方式。
你可以尝试Sequelize,这是一个用于Node的ORM构建.js支持MySQL,PostgreSQL,SQLite和MSSQL。通过使用 Sequelize,您可以创建反映数据库表的模型。第一步是实例化续集本身:
var sequelize = new Sequelize('mysql://user:pass@example.com:3306/dbname');
然后,您可以创建模型:
var Order = sequelize.define('Order', {
order_date: Sequelize.DATE,
order_value: Sequelize.STRING
});
Order.sync(); // this is run in order to reflect the changes in your database
您还可以定义模型(数据库表(之间的关系,如下所示:
var OrderItem = sequelize.define('OrderItem', {
// attributes etc...
});
OrderItem.belongsTo(Order); // this would add OrderId attribute to OrderItem, which is a Foreign Key to Order table
Order.hasMany(OrderItem); // Likewise
通过创建关系,您可以返回指定Order
OrderItems
:
Order.findById(1).then(function(order){
order.getOrderItems().then(function(orderItems){
// here you get all order items assigned to given order
});
});
就创建模型(表(和迁移它们而言,这是非常舒适的解决方案。您还可以创建自定义 SQL 语句并直接通过 sequelize
实例运行它们。查看文档,它包含大量示例并准确描述了大多数用例。
较新版本的MySQL支持JSON对象结果。这将允许您返回嵌套的子数组。
好处是您可以编写嵌套的 SQL 查询(以便 SQL 可以优化(,而不是手动获取 Node.js 中的所有子元素。
如何使用 mysql 本机 json 函数生成嵌套的 json 对象?