Sails.js 个协会

Sails.js associations

我从 sails.js 开始,我完全迷失了我的 sql 查询。

我有以下表格:

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   |     | 
+-----------+--------------+------+-----+

我想检索收音机及其相关流派。我设法使用 Model.query("Select * FROM ...") 来做到这一点,但我想使用 populate 方法来做到这一点。我查看了文档,但我对 "via""through"、...

有点困惑

好吧,如果您遵循了 Sails.js Model documentation and the many-many association docs,您的模型应该类似于:

// 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'
        }

    }
}

多对多查找 table 将由 waterline 在内部为您创建。要获得收音机的流派,您只需填充 "genres" 属性即可。

Radio.findOne({name:"RadioName"}).populate("genres").then(function(radio){
    console.log(radio); //radio.genres will have all the genres associated with this radio. 
})

我真的推荐看一下 many-many association docs。他们正是您所需要的。

应该这样做:

// 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'
        }
    }
}

然后您可以提出以下请求:

Radio.findOne({name:"RadioName"}).populate("genres").then(function(radio){
    console.log(radio); 
})