javascript - 表之间的sequelize和query
问题描述
我有三个模型:
Entity
- id
...
Event
- id
- metadata_field_id
- entity_id
- value (TEXT)
MetadataField
- id
- name (TEXT)
MetadataField.name
有一个s 和s对的数组Event.value
,我想构建一个查询,该查询将选择与这些对匹配的实体:应该是全局的AND
,然后对于每个事件,Event.value
应该是数组中的当前值,并且Event.MetadataField.name
应该是当前名称。
我不确定如何使用 Sequelize 构建它(我什至不确定查询应该是什么样子)。
我试过的是:
const eventValues = [["some_name", "some_value"], ["another_name", "another_value"]]
if (eventValues.length) {
queryObj.include = [{
model: Event,
where: {
[Op.and]: eventValues.map(c => ({
value: {
[Op.like]: `%${c[1]}%`
}
}))
},
include: [{
model: MetadataField,
[Op.and]: eventValues.map(c => ({
name: {
[Op.like]: c[0]
}
}))
}]
}]
}
return Entity.findAll(queryObj)
但这显然不起作用,因为它想要选择MetadataField
具有所有提供的名称且值相同的 s 名称。
这应该如何实施?
解决方案
它不是强制性的,你只能在包含模型中写 where 条件,但你也可以在外面写出来,但在这种情况下,你所需要的只是定义表名也 b/w '$table_name.field_name$'
,
所以,给你:
const eventValues = [["some_name", "some_value"], ["another_name", "another_value"]]
if (eventValues.length) {
queryObj.include = [{
model: Event,
include: [{
model: MetadataField
}]
}],
queryObj.where = {
[Op.or]: eventValues.map(c => ({
'$events.value$' : { // <---- Magic is here
[Op.like]: `%${c[1]}%`
} ,
'$metadata_fields.name$' : { // <---- Magic is here
[Op.like]: c[0]
}
}))
}
}
return Entity.findAll(queryObj)
注意:您可能必须根据我写的地方更改表名
// <---- Magic is here
推荐阅读
- ios - SceneKit AVPlayer 仅播放音频
- python - 使用 Locust 的恒定并行请求数
- c# - 是否有任何用于令牌处理的 IdentityServer4 服务(不是端点)?
- reactjs - 从我的 redux 状态中删除一个项目会产生多个错误
- python - Python IDE 将我的枚举显示为 BAD_CHARACTER
- c# - .NET Core SDK 版本 2.2.202 的 MSBuild 失败
- c# - Newtosoft Json反序列化:如果/当给定的json字符串具有比必要更多的属性时,如何抛出错误?
- python - 如何单击显示为标签的按钮?
- laravel - Laravel 队列与主管不与多个网站一起工作
- java - 从用户接收文件名并将文件中的每个数字分配给单独的数组