我正在为我的ORM使用[BookshelfJS] [bookshelfjs],我想知道如何访问though
表上的数据。
我有3个模型,Recipe
,Ingredient
和RecipeIngredient
加入了两个模型。
var Recipe = BaseModel.extend({
tableName: 'recipe',
defaults: { name: null },
ingredients: function () {
return this
.belongsToMany('Ingredient')
.through('RecipeIngredient')
.withPivot(['measurement']);
}
}));
var Ingredient = BaseModel.extend({
tableName: 'ingredients',
defaults: { name: null },
recipes: function () {
return this
.belongsToMany('Recipe')
.through('RecipeIngredient');
}
}));
var RecipeIngredient = BaseModel.extend({
tableName: 'recipe_ingredients',
defaults: { measurement: null },
recipe: function () {
return this.belongsToMany('Recipe');
},
ingredient: function () {
return this.belongsToMany('Ingredient');
}
}));
然后,我尝试检索Recipe
以及所有Ingredients
,但无法确定如何访问measurement
上的RecipeIngredient
。
Recipe
.forge({
id: 1
})
.fetch({
withRelated: ['ingredients']
})
.then(function (model) {
console.log(model.toJSON());
})
.catch(function (err) {
console.error(err);
});
返回:
{
"id": 1,
"name": "Delicious Recipe",
"ingredients": [
{
"id": 1,
"name": "Tasty foodstuff",
"_pivot_id": 1,
"_pivot_recipe_id": 1,
"_pivot_ingredient_id": 1
}
]
}
没有measurement
值。
我原以为.withPivot(['measurement'])
方法会抓住该值,但不会返回任何其他数据。
我是否遗漏了某些内容或误解了这是如何运作的?
答案 0 :(得分:4)
我不确定您为什么要使用through
。如果它只是一个基本的多对多映射,您可以通过执行以下操作来实现此目的:
var Recipe = BaseModel.extend({
tableName: 'recipe',
defaults: { name: null },
ingredients: function () {
return this
.belongsToMany('Ingredient').withPivot(['measurement']);
}
}));
var Ingredient = BaseModel.extend({
tableName: 'ingredients',
defaults: { name: null },
recipes: function () {
return this
.belongsToMany('Recipe').withPivot(['measurement']);;
}
}));
您不需要联结表的其他模型。只需确保将数据库中的联结表定义为ingredients_recipe
(按字母顺序连接表的名称!)。或者,您可以为belongsToMany
函数提供自己的自定义名称,以便为联结表命名。请确保ingredients_id
recipe_id
和ingredients_recipe
这就是它。然后就可以了
Recipe
.forge({
id: 1
})
.fetch({
withRelated: ['ingredients']
})
.then(function (model) {
console.log(model.toJSON());
})
.catch(function (err) {
console.error(err);
});