2016-06-14 3 views
2

У меня есть две модели sequelize с отношением «один ко многим». Назовем их «Владелец и собственность».Sequelize.js вставить модель с отношением «один ко многим»

Предположим, что они определены с использованием сиквелиса sails-hook как такового (упрощенного).

//Owner.js 
module.exports = { 
options: { 
    tableName: 'owner' 
}, 
attributes: { 
    id: { 
    type: Sequelize.BIGINT, 
    allowNull: false, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    name: { 
    type: Sequelize.STRING(255) 
    }, 
    associations: function() { 
    Owner.hasMany(Property, { 
    foreignKey: { 
     name: 'owner_id' 
    } 
    }); 
} 
} 

//Property.js 
module.exports = { 
options: { 
    tableName: 'property' 
}, 
attributes: { 
    id: { 
    type: Sequelize.BIGINT, 
    allowNull: false, 
    primaryKey: true, 
    autoIncrement: true 
    }, 
    name: { 
    type: Sequelize.STRING(255) 
    } 
} 

Предположим, я хочу вставить запись владельца в свою базу данных и вставить несколько записей свойств, чтобы связаться с владельцем. Как мне это сделать?

Я ищу что-то вроде

Owner.create({name:'nice owner', 
       property: [{name:'nice property'}, 
         {name:'ugly property'}]}); 

Удивительно, я не могу найти это в документации Sequelize.

ответ

7

Вы не можете связывать имущество существующих записей при создании владельца, вы должны сделать это сразу после, с цепочкой обещаний.

Owner.create({name:'nice owner'}).then(function(owner){ 
    owner.setProperties([{name:'nice property'}, {name:'ugly property'}]).then(/*...*/); 
}); 

Чтобы избежать проблем с этими ассоциациями (владелец создан, но некоторые ассоциации не удались), лучше использовать транзакции.

sequelize.transaction(function(t) { 
    return Owner.create({name:'nice owner'}, {transaction: t}).then(function(owner){ 
     return owner.setProperties([{name:'nice property'}, {name:'ugly property'}], {transaction : t}); 
    }); 
}); 

Однако, если вы хотите создать новый владелец, связанный с новыми свойствами, вы можете сделать что-то вроде

Owner.create({ 
    name: 'nice owner', 
    property: [ 
     { name: 'nice property'}, 
     { name: 'ugly property'} 
    ] 
},{ 
    include: [ Property] 
}); 

См http://docs.sequelizejs.com/en/latest/docs/associations/#creating-with-associations

+0

Я боролся несколько часов, потому что синтаксис был slighty отличается в последней релиз, для тех, кто не может выполнить эту работу, я рекомендую вам проверить интеграционные тесты, чтобы увидеть, как использовать метод create в самой последней версии https://github.com/sequelize/sequelize/blob/master/test /integration/model/create/include.test.js – diedu

+0

Я бы рекомендовал также использовать транзакцию для третьего примера 'create', потому что иначе, если INSERT свойств не удастся, вы застряли с полузавершенным владельцем. – pkyeck

Смежные вопросы