从MySql中的不同表中获取父和子logging(一对多)

我有一个父表,称为订单和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获取这些logging的最干净和最快的方式? 我使用NodeJS / Node-MySql,如果它有任何区别。

目前我首先获取订单logging,并在我的应用程序层中循环访问订单logging,并获取订单项logging并将其附加到每条logging。 这不是很有效的办法。

你可以给Sequelize一个镜像 ,它是Node.js的一个ORM构build,支持MySQL,PostgreSQL,SQLite和MSSQL。 通过使用Sequelize,您可以创build反映数据库表的模型。 第一步是实例化续集本身:

 var sequelize = new Sequelize('mysql://user:pass@example.com:3306/dbname'); 

那么你可以创build模型:

 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(Order); 

通过创build关系,您可以返回指定Order OrderItems

 Order.findById(1).then(function(order){ order.getOrderItems().then(function(orderItems){ // here you get all order items assigned to given order }); }); 

在创build模型(表格)和迁移它们方面,这是非常舒适的解决scheme。 您也可以创build自定义的SQL语句,并通过sequelize实例直接运行它们。 查看文档,它包含大量的示例,并精确地描述大多数用例。