我正在尝试让NODE-ORM2扩展工作。我无法找到一个全包示例,只能从模型定义级别开始(不参考数据库)。
基本上我有两个模型A和B,它们之间有一个一对一的关系,其中B.AId是A.id的外键(我可能应该在db中建立它)为简单起见,但orm2并未阅读这些关系。
我不明白为什么要寻找a_b关系表。我也不了解如何形成两种模型之间的关系。
有人可以帮忙吗?在hasOne关系中,我们可以指定字段 - 这里似乎缺少。
DB:
create table A
(
`id` int(11) NOT NULL AUTO_INCREMENT key,
`addedOn` date DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1718087 DEFAULT CHARSET=utf8;
create table B
(
`id` int(11) NOT NULL AUTO_INCREMENT KEY,
AId int(11),
`addedOn` date DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1718087 DEFAULT CHARSET=utf8;
insert into A (addedOn)values('2012-02-02')
insert into B (AId, addedOn)values((select id from A), '2012-02-04')
型号:
// User Model
module.exports = function (db, cb) {
console.log('ORM loading \'A\' model')
var A = db.define('A', {
id : Number,
addedOn : Date
}) ;
var B = A.extendsTo('B', {
id : Number,
AId : Number,
addedOn : Date
})
return cb()
}
检索:
var A = req.db.models.A
A.get(1718087, {autoFetch: true}, function(err, a){
a.getB(function(err, b){
console.log(JSON.stringify(b, null, 4))
})
console.log(JSON.stringify(a, null, 4))
})
例外:
ER_NO_SUCH_TABLE: Table 'mydb.a_b' doesn't exist
答案 0 :(得分:0)
我能够通过在Model定义中指定表名和外键来解决这个问题:
var A = db.define('A', {
id : Number,
addedOn : Date
}) ;
var B = A.extendsTo('B', {
id : Number,
AId : Number,
addedOn : Date
}, {field: 'AId', table: 'B'})
让我们看看Extend.js内部的一些推理:
exports.prepare = function (db, Model, associations, association_properties, model_fields) {
Model.extendsTo = function (name, properties, opts) {
opts = opts || {};
var assocName = opts.name || ucfirst(name);
var association = {
name : name,
table : opts.table || (Model.table + '_' + name),
field : util.wrapFieldObject(opts.field, Model, Model.table, Model.properties) || util.formatField(Model, Model.table, false, false),
getAccessor : opts.getAccessor || ("get" + assocName),
setAccessor : opts.setAccessor || ("set" + assocName),
hasAccessor : opts.hasAccessor || ("has" + assocName),
delAccessor : opts.delAccessor || ("remove" + assocName)
};
然后是util.formatField:
association_key : "{name}_{field}",
因此,除非指定,否则它假定该表是与模型名称连接的主表。并且外键是primary_table与字段参数连接。
在我的情况下,没有指定表和字段,node-orm代码正在查看带有外键A_id的表A_B。