节点Orm2扩展到NO_SUCH_TABLE



我正试图让NODE-ORM2扩展工作。我无法找到一个包含所有内容的示例,只有一些部分从模型定义级别开始(不参考DB)。

实际上我有两个模型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

我能够通过在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和字段参数连接。

在我的例子中,没有指定表和字段,节点形式代码正在查找具有外键A_id的表A_B。

最新更新