2013-11-29 4 views
27

Что разница между B.belongsTo(A) и A.hasMany(B)«belongsTo» против «» hasMany в Sequelize.js

Artist = sequelize.define('Artist', {}); 
Album = sequelize.define('Albums', {}); 

Album.belongsTo(Artist, foreignKey: 'album_belongsl_artist'); 
Artist.hasMany(Album, foreignKey: 'artist_hasmany_albums'); 

если это в обоих случаях создает Зависело таблицы в Album?

ответ

66

Когда вы делаете Album.belongsTo(Artist), вы создаете отношение, позволяющее вам позвонить в album.getArtist(). Artist.hasMany(Album) связывает ассоциацию другим способом, позволяя вам позвонить artist.getAlbums(). Если вы сделали только один из этих двух, например. если вы только сделали Album.belongsTo(Artist), вы могли бы получить исполнителя альбома, но не все альбомы исполнителя.

Обратите внимание, что из-за внешнего ключа, приведенного в вашем примере, вы фактически создаете два отношения. Сгенерированная таблица выглядит так:

CREATE TABLE IF NOT EXISTS `Albums` (`id` INTEGER NOT NULL auto_increment , `album_belongsl_artist` INTEGER, `artist_hasmany_albums` INTEGER, PRIMARY KEY (`id`)) 

Если вам нужна только одна ассоциация, иностранный ключ должен быть одинаковым. Пример:

Album.belongsTo(Artist, {foreignKey: 'album_id'}); 
Artist.hasMany(Album,{ foreignKey: 'album_id'}); 

, который генерирует:

CREATE TABLE IF NOT EXISTS `Albums` (`id` INTEGER NOT NULL auto_increment , `album_id` INTEGER, PRIMARY KEY (`id`)) ENGINE=InnoDB; 
+1

У меня аналогичная проблема, и я просто интересно, как получить отношение обратно работать. Я набрал исполнителя и набрал на нем getAlbums, который отлично работает. Но затем, когда я использую один элемент альбома из результата, который я использовал, и выполняю '' getArtists'', он возвращает только '' null''. Как это можно решить? Потому что метод '' getArtist' обеспечивается секьюритизацией. – Bernhard

+0

@Bernhard Вам, вероятно, нужно использовать опцию ['include'] (http://docs.sequelizejs.com/en/latest/api/model/?highlight=findAll) в вызове функции поиска, чтобы указать, какие отношения модели с нетерпением загружать. – doug65536

+2

после часа траления документов, пытающихся разобраться, как это сделать, ваш код очень помог! получило приятную двухстороннюю ассоциацию 1: m. ура! –