2017-05-19 1 views
0

私の問題がタイトルの説明に関連しているのを見て、私はユーザーモデルを作成しました.Fotoモデルを後発させて、それぞれの写真はちょうど1人のユーザーに関連付けることができます。hasManyはSequelize.Modelのインスタンスではないもので呼び出されました。

マイUserモデル

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

module.exports = function (sequelize, DataTypes) { 
    var User = sequelize.define("User", { 
    username: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     unique: true, 
     validate: { 
     isUnique: function (value, next) { 
      var self = this; 
      User.find({ where: { username: value } }) 
      .then(function (user) { 
       // reject if a different user wants to use the same username 
       if (user && self.id !== user.id) { 
       return next('username already in use!'); 
       } 
       return next(); 
      }) 
      .catch(function (err) { 
       return next(err); 
      }); 
     } 
     } 
    }, 

    email: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     unique: true, 
     validate: { 
     isUnique: function (value, next) { 
      var self = this; 
      User.find({ where: { email: value } }) 
      .then(function (user) { 
       // reject if a different user wants to use the same email 
       if (user && self.id !== user.id) { 
       return next('Email already in use!'); 
       } 
       return next(); 
      }) 
      .catch(function (err) { 
       return next(err); 
      }); 
     } 
     } 
    }, 

    typeOfUser: { 
     type: DataTypes.INTEGER, 
     allowNull:true, 
     defaultValue:null 
    }, 

    country: { 
     type: DataTypes.STRING, 
     allowNull:true, 
     defaultValue:null 
    }, 

    birthDate:{ 
     type: DataTypes.DATEONLY, 
     allowNull:true, 
     defaultValue:null 
    }, 

    reports: { 
     type: DataTypes.INTEGER, 
     defaultValue: 0 
    }, 

    points: { 
     type: DataTypes.INTEGER, 
     defaultValue: 0 
    }, 

    password: { 
     type: DataTypes.STRING, 
     allowNull:false 
    }, 

    numberFotos: { 
     type: DataTypes.INTEGER, 
     defaultValue: 0 
    } 
    }, { 
     classMethods: { 
     generateHash: function (password) { 
      return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
     }, 

     }, 
     instanceMethods: { 
     validPassword: function (password) { 
      return bcrypt.compareSync(password, this.password); 
     } 
     } 


    }); 

    User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'}) 

    return Foto; 
} 

私の写真のモデル

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


module.exports = function (sequelize, DataTypes) { 
    var Foto = sequelize.define("Foto", { 
    reports: { 
     type: DataTypes.INTEGER, 
     defaultValue: 0 
    }, 
    image: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 
    date: { 
     type: DataTypes.DATE, 
     allowNull:true 
    }, 
    position: { 
     type: DataTypes.RANGE, 
     allowNull: true 
    } 
    }); 

    Foto.belongsTo(User, {foreignKey: 'userId'}); 

    return Foto; 
} 

答えて

0

あなたは写真のモデルの関連を宣言する必要はありません。

Foto.belongsTo(User, {foreignKey: 'userId'}); 

あなたは1:Nの関係を持っています。モデル間では、 "1"モデル、私たちの場合はUserモデル、 "N"モデル、PhotosのIDを参照するだけで済みます。そうすること:

User.hasMany(Foto,{as: 'fotos', foreignKey: 'userId'}) 

あなたのFotoテーブルに、ユーザーテーブルを参照する名前 "userId"で列を作成します。このようにして、両方のモデルが必要に応じて関連付けられます。

+1

hmmm素晴らしい答えをいただき、ありがとうございます。 –

関連する問題