从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
实例直接运行它们。 查看文档,它包含大量的示例,并精确地描述大多数用例。