【问题标题】:Feathers-Sequelize: hasMany returns only first result, flattenedFeathers-Sequelize:hasMany 只返回第一个结果,展平
【发布时间】:2018-04-04 23:17:43
【问题描述】:

我今天第一次尝试了feathers-sequelize,现在已经在hasMany asociations 上挣扎了几个小时。

我想做一个简单的projects (>hasMany>) issues 关系,但我刚刚遇到第一个问题。

期望的输出:

{
    "id": 1,
    "name": "Project 1",
    "issues": [
        {"id": 1,
        "title": "Issue 1"},
        {"id": 2,
        "title": "Issue 2"},
    ]
}

实际输出:

{
    "id": 1,
    "name": "Project 1",
    "issues.id": 1,
    "issues.title": "Issue 1",
}

我使用 feathers-cli (v3.6.1) 生成了服务,并添加了 before-hook 以包含问题。我的模型是这样的

projects.model.js:

module.exports = function (app) {
    const sequelizeClient = app.get('sequelizeClient');
    const projects = sequelizeClient.define('projects', {
        id: { type: Sequelize.INTEGER(10).UNSIGNED, autoIncrement: true, primaryKey: true},
        name: Sequelize.STRING,
    }, 
    {
        hooks: {
            beforeCount(options) {
                options.raw = true;
            }
        }
    });

    projects.associate = function(models) {
        projects.hasMany(models.issues);
    };
}

issues.model.js

module.exports = function (app) {
    const sequelizeClient = app.get('sequelizeClient');
    const issues = sequelizeClient.define('issues', {
        id: {
            type: Sequelize.INTEGER(10).UNSIGNED,
            autoIncrement: true,
            primaryKey: true
        },
        project_id: {
            type: Sequelize.INTEGER(10).UNSIGNED,
            references: { model: 'projects' },
            onDelete: 'CASCADE',
        },
        title: Sequelize.STRING,
    }, {
        hooks: {
            beforeCount(options) {
                options.raw = true;
            }
        }
    });

    issues.associate = function (models) {
        issues.belongsTo(models.projects);
    };
    return issues;
};

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: sequelize.js feathersjs feathers-sequelize


    【解决方案1】:

    找到了答案。问题不在于模型定义,而在于包含问题模型的钩子。它需要参数 raw: false

    var includeIssues = (hook) => {
        if (hook.params.query.include) {
            const IssueModel = hook.app.services.issues.Model;
            //
            hook.params.sequelize = {
                raw: false,
                include: [
                    {model: IssueModel}
                ]
            };
            // delete any special query params so they are not used
            // in the WHERE clause in the db query.
            delete hook.params.query.include;
    
            return Promise.resolve(hook);
        }
    }; 
    

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 2016-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      相关资源
      最近更新 更多