Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 Sequelize中多对多关系的使用和操作_Javascript_Sql_Node.js_Postgresql_Sequelize.js - Fatal编程技术网

Javascript Sequelize中多对多关系的使用和操作

Javascript Sequelize中多对多关系的使用和操作,javascript,sql,node.js,postgresql,sequelize.js,Javascript,Sql,Node.js,Postgresql,Sequelize.js,简而言之,我的问题是:我想在联接表中使用AND操作。我认为这在现实生活中是一个非常普遍的用例,但我还没有找到任何相关的文章、博客或问题。(我认为是我的错:D) 让我举一个例子来说明我的意思: 我想创建一个网店,我有一个手机和一个功能模型,它们之间有多对多的关系。这项功能有一个多选过滤器(在我的网站上),我想列出那些具有所选功能的手机。(例如:A和B和C…) 我想我不能创建一个查询,因为一列不能同时是a和B,但我不确定。 例如: const mobiles=wait models.mobile.f

简而言之,我的问题是:我想在联接表中使用AND操作。我认为这在现实生活中是一个非常普遍的用例,但我还没有找到任何相关的文章、博客或问题。(我认为是我的错:D)

让我举一个例子来说明我的意思: 我想创建一个网店,我有一个手机和一个功能模型,它们之间有多对多的关系。这项功能有一个多选过滤器(在我的网站上),我想列出那些具有所选功能的手机。(例如:ABC…) 我想我不能创建一个查询,因为一列不能同时是a和B,但我不确定。 例如:

const mobiles=wait models.mobile.findAll({
其中:“???”,
属性:['id','name'],
包括:[
{
model:models.feature,
其中:“???”,
属性:['id','name],
通过:{
属性:[],
},
},
],
});
我对Sequelize和SQL解决方案感兴趣

示例模型和预期结果:

const Mobile=sequelize.define('Mobile'){
身份证:{
自动递增:真,
primaryKey:没错,
类型:DataTypes.INTEGER,
},
姓名:{
类型:DataTypes.STRING
}
}, {});
const Feature=sequelize.define('Feature'{
身份证:{
自动递增:真,
primaryKey:没错,
类型:DataTypes.INTEGER,
},
姓名:{
类型:DataTypes.STRING
}
}, {});
Mobile.belongstomy(功能,{通过:'MobileFeature'});
Feature.belongtomany(Mobile,{通过:'MobileFeature'});
//数据库中的示例数据(来自移动上下文)
常量示例数据=[
{
“id”:1,
“名称”:“Mobile1”,
“特点”:[
{
“id”:1,
“姓名”:“A”,
},
{
“id”:2,
“名称”:“B”,
},
{
“id”:3,
“姓名”:“C”,
},
],
},
{
“id”:2,
“名称”:“Mobile2”,
“功能”:[],
},
{
“id”:3,
“名称”:“Mobile3”,
“特点”:[
{
“id”:1,
“姓名”:“A”,
},
]
}
];
//预期结果
//场景:我想列出那些具有A和C功能的手机
常数结果=[
{
“id”:1,
“名称”:“Mobile1”,
“特点”:[
{
“id”:1,
“姓名”:“A”,
},
{
“id”:2,
“名称”:“B”,
},
{
“id”:3,
“姓名”:“C”,
},
]
},
];

我认为这里的查询将比
where
更复杂

您能提供适合您的问题的SQL查询吗?我想你需要使用分组、计数和拥有(但这只是假设,让它成为你的方式;)

如果我正确理解您的问题: 加入移动和功能表。然后对结果使用
where

其中:{
名称:{[Op.or]:[A,B,C]}//这里我们将所选功能名称的数组传递给where。它只返回具有此功能的手机。但我们正在寻找具有数组中传递的所有功能的手机)
}
按Mobile.name对其进行分组,统计每个手机中的功能,并使用此手机,其功能编号=按用户选择的功能(因此手机具有我们正在寻找的所有功能)

当然,最后它将是一个续集声明

更新:在对该答案的评论中回答您的问题:

首先,您需要计算功能。因此,我们将使用
COUNT
并将输出存储在
CountedFeatures
列中:

属性:['id','name',[sequelize.fn('COUNT','table.fieldToCount'),'CountedFeatures'],
然后您需要使用
group
对其进行分组。使用示例:

组:[“table.name,table.id”]
然后在此处输入代码use
having
using先前创建的
countedFeatures
列:

having:sequelize.where(sequelize.fn('COUNT','countedFeatures'),'=',searchedFeaturesArray.length)
因此,代码中的结构将如下所示:

(…).findAll({
属性:[……],
包括:[
(...)
],
组:[……],
有:[……]
})
您还可以将SQL语句日志记录打开到控制台,以查看实际发生的情况。
为此,请在
findAll
函数中添加
logging:console.log
作为属性。

能否为
mobile
feature
提供简单的续集模型示例,以及它们的关联、数据示例和预期结果?我添加了一些示例,希望对您有所帮助。听起来合理。我有两个问题:1。我必须在“having”中使用“sequelize literal”吗?2.如果我添加分组依据,如何收集“功能”?