【问题标题】:sailsjs / waterline query "where" not emptySailsjs/水线查询“哪里”不为空
【发布时间】:2014-12-29 00:43:10
【问题描述】:

你好,

在采用 hacky/cutom 方式之前,我想知道是否有内置的 query 方法来检查空/非空多对多关系,因为我在 google 和 doc 上都没有成功。

如果我以文档中的示例为例,假设我只想在用户拥有宠物时检索用户,或者通过查询检索没有任何所有者的宠物。

// A user may have many pets
var User = Waterline.Collection.extend({

  identity: 'user',
  connection: 'local-postgresql',

  attributes: {
    firstName: 'string',
    lastName: 'string',

    // Add a reference to Pet
    pets: {
      collection: 'pet',
      via: 'owners',
      dominant: true
    }
  }
});

// A pet may have many owners
var Pet = Waterline.Collection.extend({

  identity: 'pet',
  connection: 'local-postgresql',

  attributes: {
    breed: 'string',
    type: 'string',
    name: 'string',

    // Add a reference to User
    owners: {
      collection: 'user',
      via: 'pets'
    }
  }
});

附:我知道如何在查询执行后过滤结果,这不是我要问的:)

【问题讨论】:

    标签: sails.js waterline


    【解决方案1】:

    没有内置任何东西(又名 User.hasPet() )或类似的东西。所以简单的答案是否定的

    如果我事先知道这些问题,我倾向于以查询速度快的方式编写我的数据库。 IE:用户模式将有一个 hasPets 列。每当添加/删除宠物时,回调都会命中用户表以标记该字段是否具有所有者。那么我可以查询 User.findAll({hasPet:true})。

    有点多,但这取决于您需要速度的地方。

    【讨论】:

    • 嘿,谢谢你的回答,我会将它添加到“hacky”方式之一:) 我还听说一些适配器有一个 Model.query(“putyournativesqlhere”)。就我而言,目前我只是在查询完成后运行“.filter”函数。我认为水线错过了一种“WQL”(水线查询语言:))但它仍然是一个年轻的 orm,所以让我们稍等一下:)
    【解决方案2】:

    这有点晚了,但我想让您知道使用 Waterline ORM 生命周期函数很容易做到这一点。我已经在我的几个项目中做到了。基本上,使用 beforeCreate 和 beforeUpdate 函数来设置你的标志。对于您的用户,它可能看起来像...

     var User = Waterline.Collection.extend({
    
      identity: 'user',
      connection: 'local-postgresql',
    
      beforeCreate: function(values, next) {
        if (values.pets) {
          values.has_pet = true;
        } else {
          values.has_pet = false;
        }
        next();
      }
    
      beforeUpdate: function(values, next) {
        if (values.pets) {
          values.has_pet = true;
        } else {
          values.has_pet = false;
        }
        next();
      }
    
      attributes: {
        firstName: 'string',
        lastName: 'string',
    
        // Add a reference to Pet
        pets: {
          collection: 'pet',
          via: 'owners',
          dominant: true
        },
    
        has_pet: {
          type: 'boolean'
        }
      }
    });
    

    然后就可以根据has_pet属性查询了

    【讨论】:

    • 嗨,谢谢你的回复,我认为这是 Hacky 方式的一部分 ;)
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-14
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多