определите, как получить данные результирующего набора (node.js продолжение внешний ключ mysql)

#mysql #node.js #join #foreign-keys #sequelize.js

#mysql #node.js #Присоединиться #внешние ключи #sequelize.js

Вопрос:

Я искал несколько сообщений. Существует много информации о членстве и присоединении; но мою проблему я не смог решить. Я считаю, что отчасти потому, что я новичок в инструментах. Давайте перейдем к данным:

Categoria.js

 const db   = require("./db");
const Categoria = db.sequelize.define('categorias', {
    nome: {
        type : db.Sequelize.STRING
    },
    slug: {
        type: db.Sequelize.TEXT
    } 
})
module.exports = Categoria
  

Postagem.js

 const Categoria = require("./Categoria");
const db   = require("./db");
const Postagem = db.sequelize.define('postagens', {
    titulo: {
        type : db.Sequelize.STRING,
        required : true
    },
    slug: {
        type: db.Sequelize.TEXT,
        required : true
    },
    descricao: {
        type : db.Sequelize.STRING,
        required : true
    }, 
    conteudo: {
        type : db.Sequelize.STRING,
        required : true
    }, 
    categoriaId: {  // esse atributo é chave estrangeira
        type: db.Sequelize.INTEGER,
        required : true,
        allowNull: false,
        references: {            // Postagem belongsTo Categoria 1:1
          model: 'categorias',   // nome da tabela
          key: 'id'              // nome da coluna na tabela
        }
    }      
})

Postagem.belongsTo(Categoria, { foreignKey: 'categoriaId', foreignKeyConstraint: true, as: 'categoria' });

module.exports = Postagem
  

Чтение данных:

 router.get("/postagens",(req, res) => {
    Postagem.findAll({
        include:[
            {
                model: Categoria, 
                require: true,
                as: 'categoria'

            }] 
    }).then(function(postagens){ 
       console.log(postagens) 
       res.render("admin/postagens", {postagens: postagens}) 
    }).catch(function(erro){
        req.flash("error_msg", "Erro ao procurar postagens: "   erro)
        res.redirect("/admin")
    })     
})
  

Предложение выбора (идеально):

 SELECT `postagens`.`id`, `postagens`.`titulo`, `postagens`.`slug`, `postagens`.`descricao`, `postagens`.`conteudo`, `postagens`.`categoriaId`, `postagens`.`createdAt`, `postagens`.`updatedAt`, `categoria`.`id` AS `categoria.id`, `categoria`.`nome` AS `categoria.nome`, `categoria`.`slug` AS `categoria.slug`, `categoria`.`createdAt` AS `categoria.createdAt`, `categoria`.`updatedAt` AS `categoria.updatedAt` FROM `postagens` AS `postagens` LEFT OUTER JOIN `categorias` AS `categoria` ON `postagens`.`categoriaId` = `categoria`.`id`;
  

Json postagens:

 [
  postagens {
    dataValues: {
      id: 2,
      titulo: 'UX',
      slug: 'ux',
      descricao: 'O que é UX?',
      conteudo: 'O conceito de ux na web bla bla bla bla bla e mais bla',
      categoriaId: 1,
      createdAt: 2020-10-21T14:05:32.000Z,
      updatedAt: 2020-10-21T14:05:32.000Z,
      categoria: [categorias]
    },
...
  

Вопрос:

В нем не отображается содержимое категории, оно отображается только: categoria: [categorias]. Что я должен сделать, чтобы получить доступ к полю categoria.nome?

Ответ №1:

Просто получите простые объекты из экземпляров модели, подобных этому:

 const plainObjects = postagens.map(x => x.get({ plain: true }))