投稿と投稿のタグを含むアプリを構築しようとしています。これらのためにpost
、tags
とpost_tag
テーブルがあります。tags
事前に定義したタグがあり、アプリのどこかにフロントエンドでユーザーに提案されます。post_tag
テーブルは、投稿とタグの IDを各行のペアとして保持します。
Express.js と postgreql と pg-promise を使用しています。
私が知る限り、作成後の操作にはトランザクション クエリが必要です。
また、ユーザーが投稿を作成したときにタグがtags
テーブルになかったかどうかを検出しtag_id
て、その場で挿入できるようにするメカニズムも必要です。それ以外の場合は、テーブルの列と、テーブルの列をそれぞれ参照する必要があるためです。insertion
post_id
tag_id
post_tag
foreign key error
post_tag
post_id
tag_id
posts
tags
id
これは、私がこれまで使用して失敗した url 関数です。
privateAPIRoutes.post('/ask', function (req, res) {
console.log('/ask req.body: ', req.body);
// write to posts
var post_id = ''
var post_url = ''
db.query(
`
INSERT INTO
posts (title, text, post_url, author_id, post_type)
VALUES
($(title), $(text), $(post_url), $(author_id), $(post_type))
RETURNING id
`,
{
title: req.body.title,
text: req.body.text,
post_url: slug(req.body.title),
author_id: req.user.id,
post_type: 'question'
} // remember req.user contains decoded jwt saved by mw above.
)
.then(post => {
console.log('/ask post: ', post);
post_id = post.id
post_url = post.post_url
// if tag deos not exist create it here
var tags = req.body.tags;
console.log('2nd block tags1', tags);
for (var i = 0; i < tags.length; i++) {
if (tags[i].id == undefined) {
console.log('req.body.tags[i].id == undefined', tags[i].id);
var q1 = db.query("insert into tags (tag) values ($(tag)) returning id", {tag: tags[i].label})
.then(data => {
console.log('2nd block tags2', tags);
tags[i].id = data[0].id
// write to the post_tag
db.tx(t => {
var queries = [];
for (var j = 0; j < tags.length; j++) {
var query = t.query(
`
INSERT INTO
post_tag (post_id, tag_id)
VALUES
($(post_id), $(tag_id))
`,
{
post_id: post_id,
tag_id: tags[j].id
}
)
queries.push(query);
}
return t.batch(queries)
})
.then(data => {
res.json({post_id: post_id, post_url: post_url})
})
.catch(error => {
console.error(error);
})
})
.catch(error => {
console.error(error);
});
}
}
})
.catch(error => {
console.error(error);
})
});