Cómo acceder a los datos en una tabla ‘a través’ con Bookshelf

Estoy utilizando [BookshelfJS] [bookshelfjs] para mi ORM y me pregunto cómo acceder a los datos en una tabla de though .

Tengo 3 modelos, Recipe , Ingredient y Ingredient RecipeIngredient que se une a los dos.

 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'); } })); 

Luego, bash recuperar una Recipe junto con todos los Ingredients pero no puedo averiguar cómo acceder a la measurement en el RecipeIngredient .

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

Regreso:

 { "id": 1, "name": "Delicious Recipe", "ingredients": [ { "id": 1, "name": "Tasty foodstuff", "_pivot_id": 1, "_pivot_recipe_id": 1, "_pivot_ingredient_id": 1 } ] } 

Sin valor de measurement .

Pensé que el .withPivot(['measurement']) habría tomado el valor pero no devuelve ningún dato adicional.

¿Me he perdido algo o no he entendido cómo funciona esto?

No estoy exactamente seguro de por qué quieres usarlo. Si es solo una asignación básica de muchos a muchos, puede lograr esto haciendo lo siguiente:

 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']);; } })); 

No necesita un modelo adicional para la tabla de unión. Solo asegúrese de definir una tabla de unión en su base de datos como ingredients_recipe (¡unir alfabéticamente el nombre de las tablas!). O bien, puede proporcionar su propio nombre personalizado para la función belongsToMany para el nombre de la tabla de unión. Asegúrese de tener ingredients_id y recipe_id en ingredients_recipe

Esto es más o menos eso. Entonces puedes hacer

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