【问题标题】:Sails.js Populate IssueSails.js 填充问题
【发布时间】:2017-11-29 20:52:59
【问题描述】:

我在让 .populate 在 Sails 中工作时遇到问题。如果我使用以下模型并使用 .populateAll 那么它可以工作并且我得到一个关联和一些数据,但我也得到了两个帆生成函数。我只想能够从数据库中获取学校记录以及与该学校相关的所有评论。如果我使用 .populate(),我会得到错误:

错误:在为 .populate("Reviews") 构建连接指令时遇到意外错误

任何帮助都会很棒!

Schools.js 模型

module.exports = {
  autoCreatedAt: false,
  autoUpdatedAt: false,
  tableName:'schools',
  attributes: {
    SID: {
      type: 'integer',
      autoIncrement: true,
      primaryKey: true,
      size: 15
    },
    schoolName: {
      type: 'text',
    },
    schoolCity: {
      type: 'text',
    },
    schoolCountry: {
      type: 'text',
    },
    schoolRegion: {
      type: 'text',
    },
    schoolWebsite: {
      type: 'text',
    },
    schoolCountryCode: {
      type: 'text',
    },
    schoolNumbStudents: {
      type: 'integer',
    },
    schoolNumbFaculty: {
      type: 'integer',
      size: 4,
      defaultsTo: '0'
    },
    schoolCurriculum: {
      type: 'text',
    },
    schoolLanguage: {
      type: 'text',
    },
    schoolLangInstruction: {
      type: 'text',
    },
    schoolonetoone: {
      type: 'text',
    },
    schoolAccred: {
      type: 'text',
    },
    schoolRatio: {
      type: 'string',
      size: 3
    },
    schoolMission: {
      type: 'text',
    },
    schoolFiveWords: {
      type: 'text',
    },
    schoolInitiatives: {
      type: 'text',
    },
    schoolSalaryMin: {
      type: 'text',
    },
    schoolSalaryMax: {
      type: 'text',
    },
    schoolSalaryBA: {
      type: 'text',
    },
    schoolSalaryBAPlus: {
      type: 'text',
    },
    schoolSalaryMA: {
      type: 'text',
    },
    schoolSalaryMAPlus: {
      type: 'text',
    },
    schoolHealth: {
      type: 'text',
    },
    schoolAirfare: {
      type: 'text',
    },
    schoolAirfareProv: {
      type: 'text',
    },
    schoolHousing: {
      type: 'text',
    },
    schoolDependent: {
      type: 'text',
    },
    schoolShipping: {
      type: 'text',
    },
    schoolRetirement: {
      type: 'text',
    },
    schoolreviews: {
        collection: 'Reviews',
        via: 'schoolID',
        dominant: true
    }
  }
};

Reviews.js 模型

module.exports = {
  autoCreatedAt: false,
  autoUpdatedAt: false,
  tableName:'reviews',
  attributes: {
    RID: {
      type: 'integer',
      required: true,
      autoIncrement: true,
      primaryKey: true,
      size: 15
    },
    schoolID: {
      type: 'integer',
      required: true,
      size: 15,
      model:'Schools'
    },
    profileID: {
      type: 'integer',
      required: true,
      size: 15
    },
    active: {
      type: 'integer',
      required: true,
      size: 1
    },
    dateCreated: {
      type: 'date',
      required: true,
      defaultsTo: 'CURRENT_TIMESTAMP'
    },
    Q1: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q2: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q3: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q4: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q5: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q6: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q7: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q8: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q9: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q10: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q11: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q12: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q13: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q14: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q15: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q16: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q17: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q18: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q19: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q20: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q21: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q22: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q23: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q24: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q25: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q26: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q27: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q28: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q29: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q30: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q31: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q32: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q33: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q34: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q35: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q36: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q37: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q38: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q39: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q40: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q41: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q42: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q43: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q44: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q45: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q46: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q47: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q48: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q49: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q50: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q51: {
      type: 'integer',
      required: true,
      size: 2
    },
    Q52: {
      type: 'integer',
      required: true,
      size: 2
    },
    freeReview: {
      type: 'text',
      required: true
    }
  }
};

ReviewsController.js

module.exports = {
  reviews: function(req, res){
    Schools.findOne(1)
      .populate('reviews')
      .exec(function afterFind(err, theresults) {
        if (err) return res.serverError(err);
        return res.view({thereviews: theresults});
    });
  },
  schoolreviews: function(req, res){
    Reviews.find()
      .exec(function afterFind(err, theresults) {
        if (err) return res.serverError(err);
        return res.view({thereviews: theresults});
    });
  },
  testsearch: function(req, res){
    Schools.findOne(1).populate('Reviews').exec(function(err, user) {
        console.log(user);
    });
  },
};

【问题讨论】:

    标签: javascript sails.js


    【解决方案1】:

    假设学校 --> 评论是一对多的关系。您的模型设置不正确。如果您想查询学校并 .populate 每所学校的评论数据,那么您需要将评论作为集合添加到 Schools 模型中,如下所示:

    reviews: {
      collection: 'reviews',
      via: 'school'
    }
    

    注意:collection 属性是小写的模型名称。

    然后在 Review 模型中,将 SchoolID 属性替换为对 Schools 模型的引用。这将允许您在对评论进行查询时返回学校数据 - 例如:Reviews.find(...).populate('school')

    school: {
      required: true,
      model: 'schools'
    }
    

    注意:当您对没有 .populate() 的评论执行 find() 时,学校属性将是学校记录的 _id。

    【讨论】:

      猜你喜欢
      • 2015-07-25
      • 2014-09-27
      • 2014-06-20
      • 2011-03-28
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多