好的,我已经对代码进行了一些调整。为了让每个人都能阅读,我将转到实际的表格示例。我有一个表'sections'和一个表'categories'(这是一个更简单的例子)。该部分有一个带有类别的外键。所以这就是我到目前为止所做的:
类别模型.js
classMethods: {
associate() {
category.hasOne(sequelize.models.sections, {
as: 'category',
foreignKey: 'category_id'
});
},
},
部分-model.js
classMethods: {
associate() {
section.belongsTo(sequelize.models.categories, {
allowNull: true
});
},
},
服务\index.js
...
app.set('models', sequelize.models);
...
Object.keys(sequelize.models).forEach(function(modelName) {
if ("associate" in sequelize.models[modelName]) {
sequelize.models[modelName].associate();
}
});
在这种情况下,我使用的是 Jetbrains webstorm。所以我做了一个 npm start,我的表现在有正确的外键,所以这部分工作。此外,数据的显示仍然正确。获取这些部分的查询仍在工作。如果我在 index.js 中有不同的编码,那么 npm start 并没有失败,但是 section 查询失败了。
接下来是:钩子。这就是我现在感到困惑的地方。一些网站说它在“查找定义”中(我们暂时称它为,但这是在我的 vue 组件安装部分中)。然后你解释了,很好地展示了,包含在那部分,但它什么也没做,代码仍然运行,但是当我通过邮递员获取部分时,我没有看到类别信息。然后我会有例如
serviceSections.find({
include: [{
model: serviceCategories.Model
}],
query: {
$sort: {
section_description_en: 1
}
}
}).then(page => {
page.data.reverse();
this.listSections = page.data;
})
serviceCategories 被定义为“appFeathers.service('categories');”。如前所述,它什么也不做。所以回到我在这里得到的解释,它说'.. from a before hook ..'。我找到了用于类别和服务的 hooks\index.js 文件。但在这里我犯了错误。我首先在类别中进行了此调整,然后在第一节中进行了调整
exports.before = {
...
find: [{
function (hook) {
if (hook.params.query.include) {
const AssociatedModel = hook.app.services.category.Model;
hook.params.sequelize = {
include: [{ model: AssociatedModel }]
};
}
return Promise.resolve(hook);
}
}],
...
};
这给出了代码 500 fn.bind 错误。
只是想发布进度,这并不意味着我停止寻找最后一步(或缺失的一步)。
我忘记了一件事。我检查是否完成是在 chrome 中打开 F12,转到 VUE 插件并展开“listSections”,这是“serviceSections.find”的结果。我希望在其中看到类别列,但也许这是错误的期望。我在调试器的选择中也没有看到“加入”
稍后编辑:
好吧,所以我搞砸了。最终,我还看到了这篇关于如何从多对多关系中检索数据的帖子。读到这里,我认为调整“hooks\index.js”的意图是正确的,但这意味着我的代码不是。所以尝试该帖子的不同组合,以及上面提供的提示,我现在有了这个
部分\钩子\index.js
...
exports.before = {
all: [],
find: [
getCategory()
],
get: [
getCategory()
],
create: [],
update: [],
patch: [],
remove: []
};
...
function getCategory() {
return function (hook) {
const category = hook.app.services.categories.Model;
hook.params.sequelize = {
include: [{ model: category }]
};
return Promise.resolve(hook);
};
}
这在邮递员中使用 GET 工作,因为将它放在“之前”部分的“获取”部分,它在 VUE 中工作,因为我将函数放在“之前”的“查找”部分。
多重连接
好的,我需要多个连接到“部分”。我也有地位。这来自我的元数据表。所以这意味着对元数据模型中的部分进行相同的关联。我是这样做的:
元数据模型.js
classMethods: {
associate() {
metadata.hasOne(sequelize.models.sections, {
as: 'satus',
foreignKey: 'status_id',
targetKey: 'status_id'
});
}, },
在这里,我开始总是放入 foreignKey 属性。targetKey 是另一个表中列的名称。如果您需要更改它很方便。'as' 属性是一个别名,我几乎总是喜欢使用它,至少在多次使用它时是这样。在部分模型中,我对其进行了更改。
部分-model.js
classMethods: {
associate() {
section.belongsTo(sequelize.models.categories, {
allowNull: false,
as: 'category'
});
section.belongsTo(sequelize.models.metadata, {
allowNull: false,
as: 'status'
});
}, },
为了最终确定这一点,我更改了 hooks 函数。我第一次尝试了 too 功能,但没有奏效,所以我将两者合并。
部分\钩子\index.js
function getRelatedInfo() {
return function (hook) {
hook.params.sequelize = {
include: [
{
model: hook.app.services.categories.Model,
as: 'category'
},{
model: hook.app.services.metadata.Model,
as: 'status',
where: {
type: 'status'
}
}
]
};
return Promise.resolve(hook);
};
}
如您所见,我更改了函数名称。再次使用别名很重要,否则它不起作用。在元数据部分,我放置了一个过滤器。我不想在查找时加载整个表格。好的,我加入了一个 id,所以它确实是一对一的,但是如果由于某种原因元数据条目更改为不同的类型,我仍然可以选择“状态”,并且可以对不正确的行发出警告。
最后一部分是如果您想要内部或左外部联接。我通过钩子部分中的 'required: true' 属性触发了它。
VUE.js 部分
最后一部分是将其推送到 vue 组件。我在已安装部分执行此操作。我有这个代码。
const socket = io();
const appFeathers = feathers()
.configure(feathers.socketio(socket))
.configure(feathers.hooks());
const serviceSections = appFeathers.service('sections');
const serviceArticles = appFeathers.service('articles');
const serviceMetadata = appFeathers.service('metadata');
...
mounted() {
serviceArticles.find({
include: [{
model: serviceMetadata.Model,
as: 'country',
query: {
$select: [
'country_icon'
]
}
}],
query: {
$sort: {
article_description_en: 1
},
$select: [
'id',
['article_description_en', 'article_description'],
'article_length',
'article_ascend',
'article_code'
]
}
}).then(page => {
this.listTrails = page.data;
})
}
我在这里做的是从数组中过滤掉不需要的列。我也重命名了一些。'*_en' 是多语言的,所以我需要为它使用一个变量。再次重复包含以从连接中获取相关列。