TypeORM:保存具有多对多关系的记录

时间:2019-09-05 08:05:57

标签: javascript mysql typescript relational-database typeorm

保存多对多关系有一个烦人的问题! 我现在正在建立一个基于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);
    }

}

激发以下代码时的问题需要新帖子中的新ID才能保存!设置尚不存在的类别。如果存在,只需使用以下代码创建关系!

但是ID返回undefined,因为它尚未保存在数据库中!

那如何解决这个冲突呢?!

整个创建发布方法:

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

0 个答案:

没有答案