帆js模型关联

时间:2015-03-03 20:36:04

标签: node.js orm sails.js waterline

我目前有一个新闻模型和评论模型。评论显示在X id新闻中,因此对于id为5的新闻加载评论为id 5。

我的模特看起来像这样

module.exports = {

    tableName: 'raggaer_aac_news',
    autoCreatedAt: false,
    autoUpdatedAt: false,
    attributes: {
        id: {
            type: 'integer',
            primaryKey: true,
        },
        title: {
            type: 'string',
            defaultsTo: '',
            required: true
        },
        text: {
            type: 'string',
            defaultsTo: '',
            required: true
        },
        getComments: {

            required: false,
            model: 'Comments'
        }
    }
};


module.exports = {

    tableName: 'raggaer_aac_comments',
    attributes: {

        id: {

            required: true,
            type: 'integer',
            primaryKey: true
        },
        created_by: {

            type: 'string',
            required: 'true'
        },
        comment: {

            type: 'string',
            required: 'comment',
            unique: true,
            minLength: 10,
            maxLength: 100
        }
    }
}

所以在我的控制器上该怎么办?如你所见,我尝试在新闻模型中添加getComments属性,但每次加载项目时都会显示错误'无法读取未定义的属性长度'

我的控制器看起来像这样

News.findById(req.param('id')).exec(function(err, data) {

        if(data.length === 0) {

            return res.redirect('/');
        }

        return res.view('home/news', {info: data[0]});
    }); 

我怎样才能使函数也读取comments_table中的注释?

2 个答案:

答案 0 :(得分:1)

为此目的,sails.js具有populate功能。

所以,你应该这样做:

News.findById(req.param('id')).populate('getComments').exec(function(err, data) {
    // code ...
});

答案 1 :(得分:1)

您需要将您的新闻模型参考评论作为集合,然后按照@glenSwift建议并使用填充方法

news.js

module.exports = {

    tableName: 'raggaer_aac_news',
    autoCreatedAt: false,
    autoUpdatedAt: false,
    attributes: {
        id: {
            type: 'integer',
            primaryKey: true,
        },
        title: {
            type: 'string',
            defaultsTo: '',
            required: true
        },
        text: {
            type: 'string',
            defaultsTo: '',
            required: true
        },
        comments: {

            required: false,
            collection: 'comments',
            via: 'news'
        }
    }
};

comments.js

module.exports = {

    tableName: 'raggaer_aac_comments',
    attributes: {

        id: {

            required: true,
            type: 'integer',
            primaryKey: true
        },
        created_by: {

            type: 'string',
            required: 'true'
        },
        comment: {

            type: 'string',
            required: 'comment',
            unique: true,
            minLength: 10,
            maxLength: 100
        },
        news: {
            model:'news',
            required: true
        }
    }
}
控制器中的

News.findById(req.param('id')).populate('comments').exec(function(err, data) {
    // code ...
});