首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用级联插入时,TypeORM M2O O2M Relationship外键为空

使用级联插入时,TypeORM M2O O2M Relationship外键为空
EN

Stack Overflow用户
提问于 2019-01-11 11:50:45
回答 2查看 5.8K关注 0票数 3

目前,我正在尝试使用没有类型记录的Many To OneOne to Many关系来创建TypeORM。

我已经设置了以下实体:

./entity/proposal

代码语言:javascript
复制
module.exports = {
    name: "Proposal",
    columns: {
        id: {
            primary: true,
            type: "int",
            generated: true
        },
        name: {
            type: "varchar",
            length: 60
        },
        description: {
            type: "varchar",
            default: "",
            length: 150
        },
        createdAt: {
            createDate: true
        },
        updatedAt: {
            updateDate: true
        }
    },
    relations: {
        sections: {
            target: "Section",
            type: "one-to-many",
            treeParent: true,
            cascade: true,
            inverseSide: 'Proposal'
        }
    }
}

./entity/section

代码语言:javascript
复制
module.exports = {
    name: "Section",
    columns: {
        id: {
            primary: true,
            type: "int",
            generated: true
        },
        name: {
            type: "varchar",
            length: 60,
            default: "New Section"
        },
        order: {
            type: "int"
        }
    },
    relations: {
      proposal: {
          target: "Proposal",
          type: "many-to-one",
          joinColumn: true,
          nullable: false
      }
  }
}

在这里,我创建了两个函数,一个用于插入建议,另一个用于创建模拟数据,该函数使用级联特性插入行(如本例所示:https://github.com/typeorm/javascript-example)

./controller/createProposal.js

代码语言:javascript
复制
const getRepository = require('typeorm').getRepository

const createProposal = async proposal => {

    let proposalRepository = getRepository("Proposal");
    let result = await proposalRepository.save(proposal)
            .then( savedProposal  => {
                return savedProposal
            })
            .catch( err => {
                return {
                    message: "There was an issue saving the proposal",
                    err: err
                }
            });

    return result

}

module.exports = createProposal

./controller/mockData.js

代码语言:javascript
复制
const createProposal = require('../proposal/createProposal')

const insertMockData = async () => {

  let section1 = {
    name: "Letter",
    order: 1
  }

  let section2 = {
    name: "Cloud",
    order: 2
  }

  let proposal = {
    name: "Cloud Proposal",
    description: "Cloud Proposal",
    sections: [
      section1, section2
    ] 
  }

  let result = await createProposal(proposal)

}

module.exports = insertMockData

insertMockData()函数与nullable: true一起使用将产生以下结果:

代码语言:javascript
复制
=== Proposal Table ===
id  name                 description
1   "Cloud Proposal"     "Cloud Proposal"
代码语言:javascript
复制
=== Section Table ===
id  name        order     proposalid
1   "Letter"    1         null
2   "Cloud"     2         null

我需要将proposalid放在节表中,这样我就可以在proposalRepository.findOneOrFail({ id , relations: ['sections'] })中找到它了。

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2019-02-21 22:09:02

尝试将eager: true添加到Section->proposal

代码语言:javascript
复制
relations: {
    proposal: {
        target: "Proposal",
        type: "many-to-one",
        joinColumn: true,
        nullable: false,
        eager: true // This line
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-10-28 12:03:48

希望这对某人有用。最近,我在使用one-to-manymany-to-one的TypeORM和NodeJS (version 0.2.18)关系时遇到了同样的问题。

这是具有工作关系的工作实体:

代码语言:javascript
复制
const { EntitySchema } = require('typeorm')

const FirstEntity = require('../model/FirstEntity')

module.exports = new EntitySchema({
  name: 'FirstEntity',
  target: FirstEntity,
  columns: {
    id: {
      primary: true,
      type: 'bigint',
      generated: true,
    },
    createdAt: {
      type: 'timestamp with time zone',
      default: () => 'NOW()',
    },
    updatedAt: {
      type: 'timestamp with time zone',
      default: () => 'NOW()',
    },
    ...........
  },
  relations: {
    secondentities: {
      target: 'SecondEntity',
      type: 'one-to-many',
      cascade: true,
      inverseSide: 'firstEntity',
      eager: true,
      nullable: false,
    },
  },
})
代码语言:javascript
复制
const { EntitySchema } = require('typeorm')

const SecondEntity = require('../model/SecondEntity')

module.exports = new EntitySchema({
  name: 'SecondEntity',
  target: SecondEntity,
  columns: {
    id: {
      primary: true,
      type: 'bigint',
      generated: true,
    },
    createdAt: {
      type: 'timestamp with time zone',
      default: () => 'NOW()',
    },
    updatedAt: {
      type: 'timestamp with time zone',
      default: () => 'NOW()',
    },
    ...........
  },
  relations: {
    firstEntity: {
      target: 'FirstEntity',
      type: 'many-to-one',
      inverseSide: 'secondentities',
      nullable: false,
    },
  },
})

我的第一个问题是,.save() of firstEntity根本没有保存嵌套的secondentities。它由cascade属性求解。

在添加cascade之后,我的第二个问题是,保存到DB的secondentities中缺少保存的firstEntity id。通过添加inverseSide属性来解决这个问题。

请注意,nullable属性根本不起作用,因此在.save()之后,我必须手动保存保存的firstEntity并检查secondentities是否存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54145980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档