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 的多对多关系的对应关系时,它会变得有点复杂,但这也许有助于入门。
假设我有一个书架一对多关系 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 的多对多关系的对应关系时,它会变得有点复杂,但这也许有助于入门。