表之间的续集和查询

yebdmbv4  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(283)

我有三个模型:

Entity
  - id
  ...

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

MetadataField
  - id
  - name (TEXT)

有一组成对的 MetadataField.name s和 Event.value s、 我想构建一个查询来选择匹配这些对的实体:应该是全局的 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 具有所有提供的名称和相同值的。
这应该如何实施?

yrefmtwq

yrefmtwq1#

它不是强制要求您只能在include model内编写where条件,但是您也可以在include model外编写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

相关问题