Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用pivot键入多对多_Javascript_Node.js_Typeorm - Fatal编程技术网

在javascript中使用pivot键入多对多

在javascript中使用pivot键入多对多,javascript,node.js,typeorm,Javascript,Node.js,Typeorm,我使用Laravel作为主要后端应用程序,我想连接到该应用程序的数据库。我为Node.js选择了Typeorm,在其中使用Javascript和babel编译器 我试图通过透视表在用户和质询实体之间创建多对多关系 用户: 从“typeorm”导入{EntitySchema} 从“../models/User”导入用户 导出默认的新EntitySchema({ 名称:“用户”, 目标:用户, tableName:'用户', 栏目:{ 身份证:{ 小学:对, 键入:“int”, 生成:真 }, 电邮

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

我试图通过透视表在用户和质询实体之间创建多对多关系

用户:

从“typeorm”导入{EntitySchema}
从“../models/User”导入用户
导出默认的新EntitySchema({
名称:“用户”,
目标:用户,
tableName:'用户',
栏目:{
身份证:{
小学:对,
键入:“int”,
生成:真
},
电邮:{
键入:“varchar”,
可为空:false,
独一无二:真的
},
姓名:{
键入:“varchar”,
可为空:false
}
}
}, {
关系:{
挑战:{
名称:“挑战”,
目标:“挑战”,
键入:“多对多”,
可接合:{
名称:“用户挑战”,
joinColumn:{
名称:'user\u id'
}
},
瀑布:对
}
}
})
挑战:

从“typeorm”导入{EntitySchema}
从“../models/Challenge”导入质询
导出默认的新EntitySchema({
目标:挑战,
名称:“挑战”,
表名:“挑战”,
栏目:{
身份证:{
小学:对,
键入:“int”,
生成:真
},
标题:{
键入:“varchar”,
可为空:false
},
说明:{
键入:“文本”,
可为空:false
}
}
}, {
关系:{
用户:{
目标:“用户”,
键入:“多对多”,
可接合:{
名称:“用户挑战”,
joinColumn:{
名称:“挑战号”
}
}
}
}
})
数据透视表包含以下列:

id
user_id
challenge_id
通过以上这些,我尝试从users表查询数据:

constuserrepository=(wait db()).getRepository(User)
const profile=await userRepository
.findOne({id:req.body.userId}{
关系:[“挑战”]
})
console.log(配置文件)
我得到了这个错误:

Error: Relation "challenges" was not found, please check if it is correct and really exist in your entity.

如何使其工作?

我花了很多时间和我的一个朋友一起调试它,并使用
EntitySchema
通过源代码和示例代码找到了使用“双向”关系的正确方法

根据协议,关系必须由一方拥有,且仅由一方拥有,无论它是否为双向关系(意味着您将从任何一方访问该关系)。如上述评论所述,当关系由一方“拥有”时。这只意味着每个关系只能有一个
joinTable
配置

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

...
  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
    }
  }
...
这允许您从关系的两侧运行查询:

从用户方面:

const userChallenges = await userRepository.findOne(1, { relations: ['challenges'] }
从挑战方面:

const challengeUsers = await challengeRepository.findOne(1, { relations: ['users'] }

您看过文档中typeorm提供的示例了吗?这一行在文档中也很重要,JoinTable()是许多关系所必需的。您必须将JoinTable放在关系的一个(拥有)端。我在用户和质询实体中都有JoinTable对象,我无法将布尔值传递给JoinTable,因为我需要指定透视表,它已经存在于数据库中。我唯一的建议是,首先严格按照文档所说的操作,然后尝试剪切,以使您的关系正常工作。如果这不起作用,那就创建一个虚拟复制并将其推到github上,以便其他人能够提供更多帮助。尽管文档中说明了关系必须由一方拥有,并且它确实指导您如何使用装饰器来完成,但没有文档说明使用EntitySchema时的等价物是什么。也许我遗漏了一些东西,但是当我在不使用装饰器的情况下从关系的非所有者端进行查询时,我在多对多关系中遇到了类似的问题。
const challengeUsers = await challengeRepository.findOne(1, { relations: ['users'] }