如何在Sails.js / Waterline中执行多对多的Where子句?
我有这个代码
Image.find({ tags: {id: 3}}).exec(console.log);
这是错误的,但我的意图是find所有的图像tag id 3
。
一个图像可以有很多标签,许多图像可以用相同的标签(多对多)来标记。
型号代码。
图片
module.exports = { attributes: { tags: { collection: 'Tag', via: 'images' } } };
标签
module.exports = { attributes: { images: { collection: 'Image', via: 'tags' } } };
我不想使用SQL原始查询,也不想使用N+1
查询来填充所有内容。
我也尝试使用.populate()
通过使用Image.find(3).populate("images")...
但它只会填充图像,但每个图像不会有标签,所以这是行不通的我。
你可以使用下面的代码。
下面的代码可能仍然在内部执行N + 1个查询。
最好的方法来检查将启用数据库中的查询日志。
注:我没有检查代码的语法错误。
function findImagesByTagId(tagId, callback) { Tag.findOne(tagId) .populate("images") .exec(function(err, tag) { if (err) { return callback(err); } if (!tag) { return callback(new Error('tag not found: ' + tagId)); } // Collect all image ids var imageIds = _.map(tag.images, 'id'); Image.find(imageIds) .populate('tags') .exec(callback); }); }