首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有javascript中枢轴的Typeorm多对多

具有javascript中枢轴的Typeorm多对多
EN

Stack Overflow用户
提问于 2020-06-14 14:42:41
回答 1查看 3.6K关注 0票数 1

我使用Laravel作为一个主要的后端应用程序,我想连接到该应用的数据库。我为Node.js选择了Typeorm,在其中使用Javascript和babel编译器。

我正试图通过透视表在用户和挑战实体之间创建一个多对多的关系。

用户:

代码语言:javascript
复制
import { EntitySchema } from 'typeorm'
import User from '../models/User'

export default new EntitySchema({
  name: 'User',
  target: User,
  tableName: 'users',
  columns: {
    id: {
      primary: true,
      type: 'int',
      generated: true
    },
    email: {
      type: 'varchar',
      nullable: false,
      unique: true
    },
    name: {
      type: 'varchar',
      nullable: false
    }
  }
}, {
  relations: {
    challenges: {
      name: 'challenges',
      target: 'Challenge',
      type: 'many-to-many',
      joinTable: {
        name: 'users_challenges',
        joinColumn: {
          name: 'user_id'
        }
      },
      cascade: true
    }
  }
})

挑战:

代码语言:javascript
复制
import { EntitySchema } from 'typeorm'
import Challenge from '../models/Challenge'

export default new EntitySchema({
  target: Challenge,
  name: 'Challenge',
  tableName: 'challenges',
  columns: {
    id: {
      primary: true,
      type: 'int',
      generated: true
    },
    title: {
      type: 'varchar',
      nullable: false
    },
    description: {
      type: 'text',
      nullable: false
    }
  }
}, {
  relations: {
    users: {
      target: 'User',
      type: 'many-to-many',
      joinTable: {
        name: 'users_challenges',
        joinColumn: {
          name: 'challenge_id'
        }
      }
    }
  }
})

枢轴表有下列列:

代码语言:javascript
复制
id
user_id
challenge_id

有了以上所有这些,我尝试从users表中查询数据:

代码语言:javascript
复制
const userRepository = (await db()).getRepository(User)
const profile = await userRepository
  .findOne({ id: req.body.userId }, {
    relations: ['challenges']
  })

console.log(profile)

我得到了一个错误:

代码语言:javascript
复制
Error: Relation "challenges" was not found, please check if it is correct and really exist in your entity.

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-19 01:29:55

我与我的一个好友一起调试了这个程序,并通过源代码和示例代码来找出正确的方法,使用EntitySchema建立“双向”关系。

根据文档,关系必须由一方拥有,只有一方才能拥有,而不管它是否是双向关系(这意味着您将从任何一方访问关系)。当一段关系被一方“拥有”时,正如它的功率在上面的评论中提到的那样。这意味着每个关系可能只有一个joinTable配置。

在您的示例中:让我们假设User拥有这种关系。这相当于将整个joinTable配置对象放在User EntitySchema对象上:

代码语言:javascript
复制
...
  relations: {
    challenges: {
      name: 'challenges',
      target: 'Challenge',
      type: 'many-to-many',
      joinTable: {
        name: 'users_challenges',
        joinColumn: {
          name: 'user_id'
        },
        inverseJoinColumn: {
          name: 'challenge_id'
        },
      },
      inverseSide: 'User', <--- This needs to match the `target` of the users relation in the Challenge EntitySchema
      cascade: true
    }
  }
...

将inverseJoinColumn键添加到joinTable配置中,并将inverseSide添加到challenges对象。

为了从您的users EntitySchema访问Challenge关系,您可以将配置设置为至少如下:

代码语言:javascript
复制
...
  relations: {
    users: {
      type: 'many-to-many',
      inverseSide: 'challenges',
      target: 'User' <--- This needs to match the `inverseSide` of the challenges relation in the User EntitySchema
    }
  }
...

这允许您从关系的两个方面运行查询:

从用户方面:

代码语言:javascript
复制
const userChallenges = await userRepository.findOne(1, { relations: ['challenges'] }

从挑战方面:

代码语言:javascript
复制
const challengeUsers = await challengeRepository.findOne(1, { relations: ['users'] }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62374043

复制
相关文章

相似问题

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