2014-01-21 75 views
0

我是ORM的新手,我目前正在使用Express來了解Sequelize中的關聯。我正在處理的問題是hasOne和belongsTo方法以及它們應該如何在我的特定情況下調用和使用。外鍵之間有一個關聯

有兩個表

CREATE TABLE rocks(
    rock_id BIGINT 
     NOT NULL AUTO_INCREMENT, 
    name varchar(255) 
     NOT NULL, 
    rock_mode_id BIGINT 
     NOT NULL, 
    PRIMARY KEY (rock_id), 
    FOREIGN KEY (rock_mode_id) REFERENCES rock_modes(rock_mode_id), 
); 

CREATE TABLE rock_modes (
    rock_mode_id BIGINT 
     NOT NULL AUTO_INCREMENT, 
    rock_mode varchar(255), 
    PRIMARY KEY (rock_mode_id) 
); 
在JavaScript

所以之間的簡單關係,我試圖模型的定義,並放置在「DB」對象後,要做到這一點:

db.rock.hasOne(db.rock_mode, { foreignKey: 'rock_mode_id' }); 
db.rock_mode.belongsTo(db.rock, { foreignKey: 'rock_mode_id' }); 

然後,當我試圖使所有數據:

test: function(req, res) { 
    db.rock 
    .findAll({include: 
    [{ model: db.rock_mode, on: 'rock_mode_id' }]}) 
    .success(
     function(rocks) { 
      var rockString = ""; 
      var foundRockMode = ""; 
      rockString += "<h2>Rocks</h2>"; 
      for(var i = 0; i < rocks.length;i++){ 
       rockString += JSON.stringify(rocks[i])+"<br />"; 

      } 
      res.render('test', { 
        title: 'A Page Called Test', 
        body: rockString 
      }); 
     }) 
    }, 

當我運行的頁面,我得到個E錯誤:

Error: ER_BAD_FIELD_ERROR: Unknown column 'rock_mode.createdAt' in 'field list' 

什麼我最終試圖做的是要能夠訪問rock_modes的「名稱」字段,並從岩石對象打印出來。

回答

1

createdAtupdatedAt默認情況下會將字段添加到模型和相關表中。將附加到項目中時,您可以通過常規設置關閉此行爲。

var sequelize = new Sequelize('dbname', 'dbuser', 'password', { 
      host: 'hostname', 
      define: { 
       timestamps: false 
      } 
     }); 

下面是此問題的文檔:

http://sequelizejs.com/docs/latest/models#definition http://sequelizejs.com/docs/latest/models#configuration

BTW:當你試圖獲取與相關協會(預先加載)實體不需要指定外鍵,因爲它已經在關聯定義中指定。