如何使用Bookshelf

时间:2015-05-23 10:01:48

标签: javascript node.js bookshelf.js

我正在为我的ORM使用[BookshelfJS] [bookshelfjs],我想知道如何访问though表上的数据。

我有3个模型,RecipeIngredientRecipeIngredient加入了两个模型。

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'])方法会抓住该值,但不会返回任何其他数据。

我是否遗漏了某些内容或误解了这是如何运作的?

1 个答案:

答案 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_idingredients_recipe

这就是它。然后就可以了

Recipe
  .forge({
    id: 1
  })
  .fetch({
    withRelated: ['ingredients']
  })
  .then(function (model) {
    console.log(model.toJSON());
  })
  .catch(function (err) {
    console.error(err);
  });