添加项目以回复 KnexJs

Add items in reply to KnexJs

我有两个 table:销售(tbl_venda 葡萄牙语)和商品(tbl_venda_itens 葡萄牙语)。

使用下面的代码我可以发送销售数据table

const db = require('./db')
const getSales = (req, res) => {
    db('tbl_venda')
        .select('tbl_venda.id_venda', 'tbl_venda.pedido', 'tbl_venda.data_venda',
            'tbl_venda.data_entrega', 'tbl_cliente.nome AS cliente', 'tbl_vendedor.nome AS vendedor',
            'tbl_venda.obs', 'tbl_venda.total_pagar', 'tbl_venda.total_bruto', 'tbl_venda.id_loja',
            'tbl_venda.horadavenda')
        .join('tbl_cliente', 'tbl_cliente.id_cliente', 'tbl_venda.id_cliente')
        .join('tbl_vendedor', 'tbl_vendedor.id_vendedor', 'tbl_venda.id_vendedor')
        .where('data_venda', '>=', req.body.dateInitial)
        .where('data_venda', '<=', req.body.dateFinal)
        .orderBy('id_venda')
        .then(rows => res.status(201).send(rows))
        .catch(error => showError(error, res))
}

db.js

const options = {
    client: 'mysql2',
    connection: {
        ...
    }
}

const knex = require('knex')(options)
module.exports = knex

但我需要添加每次销售的商品。我试着做这样的事情:

const getSales = (req, res) => {
    db('tbl_venda')
        .select('tbl_venda.id_venda', 'tbl_venda.pedido', 'tbl_venda.data_venda',
            'tbl_venda.data_entrega', 'tbl_cliente.nome AS cliente', 'tbl_vendedor.nome AS vendedor',
            'tbl_venda.obs', 'tbl_venda.total_pagar', 'tbl_venda.total_bruto', 'tbl_venda.id_loja',
            'tbl_venda.horadavenda')
        .join('tbl_cliente', 'tbl_cliente.id_cliente', 'tbl_venda.id_cliente')
        .join('tbl_vendedor', 'tbl_vendedor.id_vendedor', 'tbl_venda.id_vendedor')
        .where('data_venda', '>=', req.body.dateInitial)
        .where('data_venda', '<=', req.body.dateFinal)
        .orderBy('id_venda')
        .then(rows => {
            return rows.map(row => {
                return db('tbl_venda_itens')
                    .select('tbl_venda_itens.id_venda_itens', 'tbl_venda_itens.id_venda',
                        'tbl_fornecedor.nome_fantasia AS fabricante', 'tbl_venda_itens.quantidade',
                        'tbl_estoque.descricao AS produto', 'tbl_venda_itens.valor_unitario',
                        'tbl_venda_itens.valor_total', 'tbl_venda_itens.cor', 'tbl_venda_itens.desconto',
                        'tbl_venda_itens.preco_final')
                    .join('tbl_fornecedor', 'tbl_venda_itens.id_fornecedor', 'tbl_fornecedor.id_fornecedor')
                    .join('tbl_estoque', 'tbl_venda_itens.id_estoque', 'tbl_estoque.id_estoque')
                    .where('id_venda', '=', row.id_venda)
                    .then(values => {
                        const newRow = { ...row, item: { ...values } }
                        return newRow
                    })
            })
        })
        .then(values => res.status(201).send(values))
        .catch(error => showError(error, res))

}

没用,我只收到空对象。

const getSales = (req, res) => {
    db('tbl_venda')
        .select('tbl_venda.id_venda', 'tbl_venda.pedido', 'tbl_venda.data_venda',
            'tbl_venda.data_entrega', 'tbl_cliente.nome AS cliente', 'tbl_vendedor.nome AS vendedor',
            'tbl_venda.obs', 'tbl_venda.total_pagar', 'tbl_venda.total_bruto', 'tbl_venda.id_loja',
            'tbl_venda.horadavenda')
        .join('tbl_cliente', 'tbl_cliente.id_cliente', 'tbl_venda.id_cliente')
        .join('tbl_vendedor', 'tbl_vendedor.id_vendedor', 'tbl_venda.id_vendedor')
        .where('data_venda', '>=', req.body.dateInitial)
        .where('data_venda', '<=', req.body.dateFinal)
        .orderBy('id_venda')
        .then(rows => {
            const requests = rows.map(row => {
                return db('tbl_venda_itens')
                    .select('tbl_venda_itens.id_venda_itens', 'tbl_venda_itens.id_venda',
                        'tbl_fornecedor.nome_fantasia AS fabricante', 'tbl_venda_itens.quantidade',
                        'tbl_estoque.descricao AS produto', 'tbl_venda_itens.valor_unitario',
                        'tbl_venda_itens.valor_total', 'tbl_venda_itens.cor', 'tbl_venda_itens.desconto',
                        'tbl_venda_itens.preco_final')
                    .join('tbl_fornecedor', 'tbl_venda_itens.id_fornecedor', 'tbl_fornecedor.id_fornecedor')
                    .join('tbl_estoque', 'tbl_venda_itens.id_estoque', 'tbl_estoque.id_estoque')
                    .where('id_venda', '=', row.id_venda)
                    .then(values => {
                        const newRow = { ...row, itens: [...values] }
                        return newRow
                    })
                    .catch(error => showError(error, res))
            })
            return Promise.all(requests)
        })
        .then(values => res.status(201).send(values))
        .catch(error => showError(error, res))
}

字体:https://www.freecodecamp.org/news/promise-all-in-javascript-with-example-6c8c5aea3e32/