仅将LEFT JOIN序列化为单列值

时间:2019-12-05 19:01:34

标签: mysql node.js sequelize.js

所以我有下一个结构:评论,用户,顶。

用户有很多喜欢,评论有很多喜欢。

我正在尝试获取所有评论,并检查用户是否喜欢它们。我有一个与LEFT JOIN的原始查询,它工作得很好:

await sequelize.query(`SELECT comments.*, likes.liked FROM comments LEFT JOIN 
likes ON likes.commentId = comment.id AND likes.user_id = '123'`, {type: Sequelize.QueryTypes.SELECT});

我得到这样的东西:

    [{
        "id": 1,
        "userId": "123",
        "comment": "abcde",
        "liked": true
    },
    {
        "id": 2,
        "userId": "552",
        "comment": "abc",
        "liked": null
    }]

现在我正在尝试使用findAll()方法来实现相同的功能。

await Comment.findAll({
        include: [{
            model: Like,
            attributes: ['liked'],
            where: {user_id: id},
            required: false
        }]
    })

但是我得到了:

[{
    "id": 1,
    "userId": "123",
    "comment": "abcde",
    "likes": [{liked:true}]
},
{
    "id": 2,
    "userId": "552",
    "comment": "abc",
    "likes": []
}]

所以问题是:如何仅包含列liked而不包含likes数组?谢谢。

1 个答案:

答案 0 :(得分:2)

将属性重新定位到主模型中。来自所包含模型的属性是嵌套的...。而主模型则不是。下面是一个示例。如果属性名称出现在查询的> 1个表中,则可以添加表名。

await Comment.findAll({
   include: [{
     model: Like,
     attributes: [],   // attributes here are nested under "Like" 
     where: {user_id: id},
       required: false
     }],
   attributes: {
     include: [[Sequelize.col("liked"), "liked"]]  // NOT nested
   }
 })