#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 }))