bookshelf js – 如何通过关联记录的匹配条件来查询记录?

bookshelf js – how to query records by matching criteria on associated records?

假设我有一个书架一对多关系 Person => Cars,其中

伪代码

# Person

hasMany: cars
id
name

# Car
belongsTo: person
id
make

现在我想找到所有拥有 'Rover' 的人。

我天真地希望的是这样的东西,这显然是行不通的:

Person.query({ where: { cars: { make: 'Rover' } } } )

您需要使用 withRelated 选项来获取相关模型。试试这个,

Person.forge()
  .fetchAll({
      withRelated: [{
       cars: function(qb) {
          qb.where({make: 'Rover'})
       }
    }]
  })
  .then(function(persons) {
     //do something
  });

来自文档的更多内容here

看来没有真正优雅的解决方案。我终于通过使用连接解决了我的问题。

看起来像这样:

Person.query((qb) => {
  qb.join('cars', 'cars.person_id', 'person.id');
  // no that the cars are joined,
  // they are available for querying
  qb.where({'cars.make': 'Rover'});
})
.then((result) => {
  // do stuff
})
.catch((err) => {
  // always catch errors
  console.error(err);
});

当您想查询与 pivot/intermediate table 的多对多关系的对应关系时,它会变得有点复杂,但这也许有助于入门。