查询相关BelongsToMany

时间:2016-04-24 18:13:31

标签: bookshelf.js knex.js

用户模型

None

控制器

    var User = db.Model.extend({
    initialize: function() {
      this.on('creating', this.generateId, this);
    },
    tableName: 'users',
    hasTimestamps: true,
    hidden: ['password'],
    companies: function(){
      return this.belongsToMany(
        require('./company'),
        'users_companies',
        'user_id',
        'company_id'
      )
    },
    charities: function(){
      return this.belongsToMany(
        require('./charity'),
        'users_charities',
        'user_id',
        'charity_id'
      ).withPivot(['company_id']);
    },
    generateId: function(model, attrs, options) {
      model.set('id', uuid.v4());
    }
});

但是,上面的工作,我需要能够查询返回的慈善机构,以便通过'company_id'的数据透视字段进行过滤。尝试charities.where({company_id:1})。fetch()会导致一个异常,说明哪里不是慈善机构的功能。

找到解决方案

exports.getAllCharities = function(req, res){
  new User({ id: req.user.id })
  .charities()
  .fetch()
  .then(function(charities){
    return res.json(charities.toJSON());
  })

有人可以解释它与使用new User({ id: req.user.id }) .charities() .query('where', 'company_id', '=', req.query.companyid) .fetch() .then(function(charities){ return res.json(charities.toJSON()) })

之间的区别

1 个答案:

答案 0 :(得分:0)

好吧,使用.where({company_id: req.query.companyid})你基本上限制自己“这 - 等于 - 那”。如果您使用query,您可以获得更多,例如.query('where', 'age', '>', 10)

此外,您可以使用query稍微不同,您可以使用knex查询构建器。 E.g:

new Person().query(function(qb) {
    qb.whereIn('id', [2, 4]);
}).fetch().then(function(){});

这样您基本上可以访问knex.js提供的所有内容:http://knexjs.org/