如何在Sails.js / Waterline中执行多对多where子句?

时间:2017-04-22 07:25:01

标签: node.js orm sails.js

我有这段代码

Image.find({ tags: {id: 3}}).exec(console.log);

这是错误的,但我的目的是找到所有具有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")...,但它只会填充图片,但每张图片都没有标签,所以这对我不起作用。< / p>

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码。

下面的代码仍然可以在内部进行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);
    });
}