【问题标题】:Sails.js Model Association IssueSails.js 模型关联问题
【发布时间】:2017-11-29 14:48:14
【问题描述】:

我一直在 StackOverflow 上查看大量教程和问题,但仍然卡住了。

在 Sails.js 中,我试图将两个模型连接在一起,这些模型已经在 MySQL 数据库中有数据,但我无法让 Sails 通过关联输出数据。我可以让 Sails 独立输出每个模型,但是当我尝试连接它们时,我只会出错。我正在努力正确链接关联和输出。

我正在尝试输出所有评论并加入学校信息以输出到视图中的表格。

我的模型是: api/models/Schools.js

module.exports = {
  connection: 'mysql',
  tableName: 'schools',
  autoCreatedAt: false,
  autoUpdatedAt: false,
  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',
    },
    reviews: {
      collection: 'review',
      via: 'theschool'
    }
  }
};

api/models/Reviews.js

module.exports = {
  connection: 'mysql',
  tableName: 'reviews',
  autoCreatedAt: false,
  autoUpdatedAt: false,
  attributes: {
    RID: {
      type: 'integer',
      required: true,
      autoIncrement: true,
      primaryKey: true,
      size: 15
    },
    schoolID: {
      type: 'integer',
      required: true,
      size: 15
    },
    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
    },
    theschool: {
      model: 'schools',
      via: 'reviews'
    }
  }
};

我的控制器代码是。

module.exports = {
  reviews: function(req, res){
    Schools.find().populate('reviews').exec(function afterFind(err, review) {
      if (err) return res.serverError(err);
      console.log(review);
      return res.view({thereviews: review});
    });
  },

};

感谢您的帮助!

【问题讨论】:

  • 我不确定你是否可以通过 model 属性使用
  • 我不确定这意味着什么?如果我将 the.find() 分别用于其中一个模型,我会得到我正在寻找的数据。不是将两个模型连接在一起的关联吗?还是 .populate 函数的问题?
  • 正如您自己弄清楚的那样,我是说在您的模型定义中,在评论中,对于“theschool”属性,您同时具有“model”和“via”。 “via”应该与“collection”类型一起使用,而不是与“model”类型一起使用

标签: javascript node.js sails.js


【解决方案1】:

我自己想通了。对于任何被卡住的人......

在 Schools.js 中,我修改了模型属性。

reviews: {
      collection: 'review',
      via: 'theschool'
    }

 reviews: {
        collection: 'reviews',
        via: 'schoolID',
        dominant: true
    }

via 引用 Reviews.js 模型中的 schoolID

在 Review.js 中,我修改了模型。我删除了属性,

theschool: {
      model: 'schools',
      via: 'reviews'
}

并将 schoolID 属性更新为

schoolID: {
      type: 'integer',
      required: true,
      size: 15,
      model:'schools'
    },

然后对于我拥有的控制器。

reviews: function(req, res){
    Schools.findOne(1)
      .populateAll()
      .exec(function afterFind(err, theresults) {
        if (err) return res.serverError(err);
        return res.view(theresults);
    });
  },

它并没有完全按照我的意愿输出数据,但它至少将两个表/模型连接在一起。我还认为诀窍是 via 需要是数据库中的表字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多