表之间的Sequelize和查询

时间:2018-05-01 04:54:06

标签: javascript mysql node.js sequelize.js

我有三种模式:

Entity
  - id
  ...


Event
  - id
  - metadata_field_id
  - entity_id
  - value (TEXT)

MetadataField
  - id
  - name (TEXT)

拥有MetadataField.nameEvent.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)   

但显然这不起作用,因为它想要选择{em>所有所提供名称的MetadataField名称,并且值相同。

应如何实施?

1 个答案:

答案 0 :(得分:1)

您不能强制要求只在包含模型的情况下写入条件,但您也可以在其中写出,但在这种情况下,您只需要定义表格名称b / w <div class="container-fluid"> <div class="row"> <!-- Menú lateral --> {%include menu-lateral.html%} <div class="col-sm-10" id="main-content-post"> <div class="row"> <div class="col-sm-10"> <h2>{{ post.title }}</h2> {{content}} {% if post.category == "textual" %} {% include disqus.html %} {% endif %} </div> </div> </div> </div> </div>

所以,你走了:

'$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)