【问题标题】:Node Orm2 ExtendsTo NO_SUCH_TABLE节点 Orm2 扩展到 NO_SUCH_TABLE
【发布时间】:2014-05-02 16:50:47
【问题描述】:

我正在尝试让 NODE-ORM2 扩展工作。我找不到要遵循的全包示例,只有从模型定义级别开始的部分示例(不参考数据库)。

基本上我有两个模型 A 和 B,它们之间存在 一对一 关系,其中 B.AId 是 A.id 的外键(我可能应该在数据库中建立它为简单起见声明,但 orm2 不读取这些关系。

我不明白它为什么要寻找 a_b 关系表。我也不明白如何形成两个模型之间的关系。

有人可以帮忙吗?在 hasOne 关系中,我们可以指定字段 - 这里似乎缺少。

数据库:

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

【问题讨论】:

    标签: javascript node.js node-orm2


    【解决方案1】:

    我能够通过在模型定义中指定表名和外键来解决这个问题:

    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和field参数拼接的。

    在我的例子中,没有指定表和字段,node-orm 代码正在寻找带有外键 A_id 的表 A_B。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2019-01-02
      • 1970-01-01
      相关资源
      最近更新 更多