保存多对多关系有一个烦人的问题! 我现在正在建立一个基于WordPress数据库模式的博客,当用户创建帖子时,我需要检查的问题是他输入的类别,标签... etc已经存在或不存在!因此,如果不存在,则只需设置类别和新帖子之间的关系即可;如果不使用级联功能通过帖子创建新类别。
为此,我编写了以下代码:
async function sanatizeTaxonmies(postId: any) {
let taxonomies = [];
for (let i = 0; i < entries.length; i++) {
const entry = entries[i];
let taxonomiesDB: any = await createQueryBuilder("WpTermTaxonomyModel")
.leftJoinAndSelect("WpTermTaxonomyModel.term", "wpTermsModel")
// .where("WpTermTaxonomyModel.taxonomy = :taxonomy", { taxonomy: 'category' })
.where("wpTermsModel.slug = :slug", { slug: entry.term.name.toLowerCase().replace(/\s+/g, '-') })
.getOne()
if (await taxonomiesDB) {
await getConnection()
.createQueryBuilder()
.relation(WpPostsModel, 'taxonomies')
.of(postId)
.add(taxonomiesDB.term.term_id)
} else {
let newTaxonomy = new WpTermTaxonomyModel();
newTaxonomy = {
taxonomy: entry.taxonomy,
description: '',
term: {
name: entry.term.name,
slug: entry.term.name.replace(/\s+/g, '-'),
term_group: 0,
// term_id: entry.term.term_id
}
}
taxonomies.push(newTaxonomy);
} // End condtion
} // End looping
if (taxonomies.length > 0) {
newPost.taxonomies = taxonomies
// await new WpPostsController().postRepository.save(newPost);
}
}
整个创建发布方法:
private createPost = async (request: express.Request, response: express.Response) => {
const data: WpPostsModel = request.body;
const entries: any[] = request.body.taxonomies;
// let taxonomies = [];
async function sanatizeTaxonmies(postId: any) {
let taxonomies = [];
for (let i = 0; i < entries.length; i++) {
const entry = entries[i];
let taxonomiesDB: any = await createQueryBuilder("WpTermTaxonomyModel")
.leftJoinAndSelect("WpTermTaxonomyModel.term", "wpTermsModel")
// .where("WpTermTaxonomyModel.taxonomy = :taxonomy", { taxonomy: 'category' })
.where("wpTermsModel.slug = :slug", { slug: entry.term.name.toLowerCase().replace(/\s+/g, '-') })
.getOne()
if (await taxonomiesDB) {
await getConnection()
.createQueryBuilder()
.relation(WpPostsModel, 'taxonomies')
.of(postId)
.add(taxonomiesDB.term.term_id)
} else {
let newTaxonomy = new WpTermTaxonomyModel();
newTaxonomy = {
taxonomy: entry.taxonomy,
description: '',
term: {
name: entry.term.name,
slug: entry.term.name.replace(/\s+/g, '-'),
term_group: 0,
// term_id: entry.term.term_id
}
}
taxonomies.push(newTaxonomy);
} // End condtion
} // End looping
if (taxonomies.length > 0) {
newPost.taxonomies = taxonomies
// await new WpPostsController().postRepository.save(newPost);
}
}
let newPost = await this.postRepository.create({
post_title: data.post_title,
post_content: data.post_content,
post_excerpt: data.post_excerpt,
post_type: 'post',
post_mime_type: '',
comment_status: 'closed',
ping_status: 'closed',
to_ping: '',
pinged: '',
comment_count: 0,
post_parent: 0,
post_status: 'publish',
post_content_filtered: '',
post_password: '',
post_name: (data.post_title) ? data.post_title.replace(/\s+/g, '-') : '',
post_date: new Date(),
post_date_gmt: new Date(),
post_modified: new Date(),
post_modified_gmt: new Date(),
// taxonomies
});
await sanatizeTaxonmies( newPost.ID ) // newPost.id return undefined
newPost = await this.postRepository.save(newPost);
// if i run the function here the set relation with work but creating categories not becuse not saved on the DB
response.send(newPost);
}