首页 > 解决方案 > 表之间的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 名称。

这应该如何实施?

标签: javascriptmysqlnode.jssequelize.js

解决方案


它不是强制性的,你只能在包含模型中写 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


推荐阅读