2017-06-01 6 views
0

私は木のように機能する3つのモデル、植物、ジャンル、家族を持っています。ツリー内の結合データを再編成する

各ファミリには、各ジャンルが1つのファミリに関連付けられている多くのジャンルを持つことができます。

ジャンルと同じですが、それぞれ1つは植物が多く、1つの植物は1つのジャンルを持つことができます。

だから、それに基づいて、私はこのモデルがあります:

工場

"use strict"; 
var sequelize = require('./index'); 
var bcrypt = require('bcrypt-nodejs'); 
var User = require('./User'); 


module.exports = function (sequelize, DataTypes) { 
    var Plant = sequelize.define("Plant", { 
    specie: { 
     type: DataTypes.STRING, 
     allowNull: false, 
    }, 
    description: { 
     type: DataTypes.TEXT, 
     allowNull: true, 
     defaultValue: "No description for this plant yet" 
    }, 
    directory: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    genreId: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    } 
    }, 
    { 
     associate: function (models) { 
     Plant.hasMany(models.Foto, { foreignKey: "plantId", as: 'fotos' }); 
     } 
    } 
); 

ジャンル

module.exports = function (sequelize, DataTypes) { 
    var Genre = sequelize.define("Genre", { 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    familyId: { 
     type: DataTypes.INTEGER, 
     allowNull: true 
    }, 
    directory: { 
     type: DataTypes.STRING, 
     allowNull: false 
    } 
    }, 
    { 
     associate: function (models) { 
     Genre.hasMany(models.Plant, { foreignKey: "genreId", as: 'plant' }); 
     } 
    } 
); 

ファミリー

module.exports = function (sequelize, DataTypes) { 
    var Family = sequelize.define("Family", { 
    name: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
     directory: { 
     type: DataTypes.STRING, 
     allowNull: false 
     } 
    }, 
    { 
     associate: function (models) { 
     Family.hasMany(models.Genre, { foreignKey: "familyId", as: 'genre' }); 
     } 
    } 
); 

今、植物(ジャンルと家系)に関連するすべてのデータを取得したいので、私はreq.params.idを経由して、ルーティングの工場のIDを渡します。

その後、インクルードを実行しようとすると、プラントに関連するすべてのデータを含むjsonを取得する必要があるため、熱心な読み込みでデータを取得できます。

しかし、私は他のモデルに関連するデータを得ることができません、特定のプラントテーブルだけで、どんな助けもありますか?ここで

は、サーバ上のコントローラのコードです:

specificPlant: function (req, res, next) { 
     Plant.findAll({ 
      where: { 
       id: req.params.id, 
      }, 
      include: [{ all: true }] 

     }).then(function (plant) { 
      console.log(plant); 
      return res.send(plant); 
     }).catch(function (err) { 
      return res.status(400).send({ message: err.stack }); // 
     }) 
    } 

答えて

0

まず、あなたがデータを取得できるようになります関連付けを定義するプラント - > Genre->次に家族

Plant.hasMany(models.Genre, {foreignKey: "genreId", as: 'genre' }); 
Genre.hasMany(models.Family, { foreignKey: "familyId", as: 'family' }); 

あなたがすることができますクエリ

Plant.findAll({ 
     where: { 
      id: req.params.id, 
     }, 
     include: [{ 
      model: Genre, 
      as: 'genre', 
      include: [{ 
       model: Family, 
       as: 'family' 
      }] 
     }] 
    }).then(function (plant) { 
     //plant 
     //plant.genre 
     //plant.genre.family 
    }); 
+0

Family.hasMany(Genres)とGenre.hasMany(Plant)ではありませんか? –

+0

いいえ、hasManyリレーションでは、Family-> Genresを照会することができます。逆のGenres-> Family –

+0

を照会する必要があるので、hasmanyを使用する代わりにbelongsTooを使用できませんか? S –

関連する問題