【问题标题】:Sailsjs Mysql ORM multiple query on the same table fieldSailsjs Mysql ORM对同一个表字段的多个查询
【发布时间】:2015-07-05 09:13:03
【问题描述】:

我正在使用sails v 0.10.5 和最新的sails-mysql

我有一个餐厅过滤系统

Venue.find().populate('comments', {
        deleted: false
    }).where({
            restaurant_services: {contains: '"delivery":1'},
            restaurant_services: {contains: '"takeout":1'},
            restaurant_specialties: {contains: '"breakfast":1'}
    })

现在的问题是,当我从客户端获取数据时,我不知道用户为restaurat_services 选择了多少项目,所以显然我必须为.where() 函数创建一个动态JSON 对象

问题是,我不能这样做

var searchObj = {};
searchObj['restaurant_specialties'] = {contains: '"breakfast":1'}; 

searchObj['restaurant_specialties'] = {contains: '"breakfast":1'};

所以你可能会看到之前的值设置被第二次替换了,

非常感谢聪明人的任何帮助here 但不起作用

Model.find({
  name: { 'contains' : ['Walter', 'Skyler'] }
});

【问题讨论】:

    标签: mysql sql node.js sails.js waterline


    【解决方案1】:

    为了根据水线的工作原理执行此操作,您需要不同的字段进行搜索。

    您可以通过在模型中创建别名属性来做到这一点。

    venue.js
    module.exports.attributes = {
        restaurant_services:'string',
        restaurant_services_1: {type:'string',columnName: 'restaurant_services'}
        restaurant_services_2: {type:'string',columnName: 'restaurant_services'}
        restaurant_services_3: {type:'string',columnName: 'restaurant_services'}
        restaurant_services_4: {type:'string',columnName: 'restaurant_services'}
        restaurant_services_5: {type:'string',columnName: 'restaurant_services'}
    }
    

    那你就可以了

    Venue.find().populate('comments', {
            deleted: false
        }).where({
                restaurant_services: {contains: '"delivery":1'},
                restaurant_services_1: {contains: '"takeout":1'},
                restaurant_specialties: {contains: '"breakfast":1'}
        })
    

    它很老套,但它可以工作

    【讨论】:

    • 这似乎太 hacky Meeker 太混乱了,我相信你比我聪明,但我不喜欢这样,你是否认为我应该将 restaurant_specialities 保存为字符串而不是数据库中的 JSON ?
    • 我有 9 个餐厅服务。那么我必须在场地模型中创建 9 个属性吗?是否有在模型中创建属性的动态方式?
    • 我刚试过这个。由于某种原因不起作用 Meeker,我很困惑为什么,我仍然得到“delivery”:“0”的记录,我真的需要一些帮助,兄弟
    • 这里有一个问题@Meeker,这是正确的查询,我运行了这个查询大约 30 次并看到了一个模式,该模式是只考虑了最后一个 key:value , 所有其他键:顶部的值被 ORM 忽略。我认为这个问题可能已经成为 Waterline 中的一个实际问题。请让我知道你的想法干杯伙伴
    【解决方案2】:
    Venue.find().populate('comments', {
        deleted: false
    }).where({
            restaurant_services: {
                contains: '"delivery":1',
                contains: '"takeout":1',
            },
            restaurant_specialties: {contains: '"breakfast":1'}
    })
    

    你需要的

    Venue.find({
      where:{
        restaurant_services: {
          contains: '"delivery":1',
          contains: '"takeout":1',
        },
        restaurant_specialties: {
          contains: '"breakfast":"1"'
        }
      }
    }).populate('comments', {
        deleted: false
    }).exec(console.log);
    

    【讨论】:

    • 好的酷,你能告诉我如何在 where() 函数中生成这个查询吗?这是挑战兄弟,因为有时可能会有 5 个餐厅特色菜
    • 由于某种原因,这不会过滤数据,我有时会得到带有 "delivery":"0" 的记录 :(
    • @user3656084 你能把sql脚本发给你吗,我可以知道你需要什么,对不起我的英语不好。
    • 没关系 @zieglar 我使用原始 sql Venue.query() 得到了结果
    • Venue.query('SELECT * FROM `venue` WHERE ' ( `restaurant_services` LIKE '%"delivery":"1"%' AND `restaurant_services` LIKE '%"reserve":"1"%' ) AND (`restaurant_specialties` LIKE '%"breakfast":"1"%' )
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多