可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am beginning with sails.js and I am completely lost with my sql queries.
I have the following tables :
genres +-----------+--------------+------+-----+ | Field | Type | Null | Key | +-----------+--------------+------+-----+ | id | int(6) | NO | PRI | | name | varchar(100) | NO | | | slug | varchar(255) | NO | | | type | varchar(32) | NO | | | parent_id | int(11) | YES | MUL | +-----------+--------------+------+-----+ genres_radios +----------+--------+------+-----+ | Field | Type | Null | Key | +----------+--------+------+-----+ | genre_id | int(6) | NO | MUL | | radio_id | int(6) | NO | MUL | +----------+--------+------+-----+ radios +-----------+--------------+------+-----+ | Field | Type | Null | Key | +-----------+--------------+------+-----+ | id | int(5) | NO | PRI | | name | varchar(100) | NO | | | slug | varchar(100) | NO | | | url | varchar(100) | NO | | +-----------+--------------+------+-----+
I want to retrieve the radios and their associated genres. I managed to do it using the Model.query("Select * FROM ...") but I'd like to do it using the populate method. I had a look at the docs, but I am a bit confused with the "via", "through", ...
回答1:
This should do it :
// api/models/Genres.js module.exports = { attributes : { name : { type: 'string' }, slug : { type: 'string' }, type : { type: 'string' }, radios : { collection: 'Radios', through: 'genres_radios' } } } // api/models/Radios.js module.exports = { attributes : { name : { type: 'string' }, slug : { type: 'string' }, url : { type: 'string' }, genres : { collection: 'genre', through: 'genres_radios' } } } // api/models/Genres_radios.js module.exports = { attributes = { 'Genre_id': { columnName:'genre_id', type:'integer', foreignKey:'true', references:'genres', on:'id', via:'genres' }, 'Radio_id': { columnName:'radio_id', type:'integer', foreignKey:'true', references:'radios', on:'id', via:'radios' } } }
And then you can make the following request :
Radio.findOne({name:"RadioName"}).populate("genres").then(function(radio){ console.log(radio); })
回答2:
Well if you've followed the Sails.js Model documentation and the many-many association docs your models should look something like:
// api/models/genre.js module.exports = { attributes : { name : { type: 'string' }, slug : { type: 'string' }, type : { type: 'string' }, radios : { collection: 'radio', via: 'genres' } } } // api/models/radio.js module.exports = { attributes : { name : { type: 'string' }, slug : { type: 'string' }, url : { type: 'string' }, genres : { collection: 'genre', via: 'radios' } } }
The many-many lookup table will be created for you internally by waterline. All you need to get the genres for your radio is populate the "genres" attribute.
Radio.findOne({name:"RadioName"}).populate("genres").then(function(radio){ console.log(radio); //radio.genres will have all the genres associated with this radio. })
I really do recommend looking at the many-many association docs. They have exactly what you need.