Javascript NodeJS | SailsJS | Waterline:在一对多-对-多对多关系中自动生成模型 下面需要什么类型的关系,以及如何利用SailsjS/Waterline简化查找和更新查询?

Javascript NodeJS | SailsJS | Waterline:在一对多-对-多对多关系中自动生成模型 下面需要什么类型的关系,以及如何利用SailsjS/Waterline简化查找和更新查询?,javascript,database-design,sails.js,one-to-many,waterline,Javascript,Database Design,Sails.js,One To Many,Waterline,在我的应用程序中,我有列表(列表模型)、项目(项目模型)和供应(供应模型)。该应用程序的目的是管理库存。因此,项是离散的——这意味着,项集合中只能有一个相同的项(primaryKey设置在Item.name)。单个列表与项目共享一对多的关系——通过条款替代。准备金只是给定列表中[离散]项的详细信息。在这种情况下,只有同时使用列表Id和项目Id才能访问规定(List.Id+Item.Id==Provision.compositePrimaryKey) 我的问题是处理find和update操作的复杂

在我的应用程序中,我有列表(列表模型)、项目(项目模型)和供应(供应模型)。该应用程序的目的是管理库存。因此,项是离散的——这意味着,项集合中只能有一个相同的项(
primaryKey
设置在
Item.name
)。单个列表与项目共享一对多的关系——通过条款替代。准备金只是给定列表中[离散]项的详细信息。在这种情况下,只有同时使用列表Id和项目Id才能访问规定(
List.Id+Item.Id==Provision.compositePrimaryKey

我的问题是处理
find
update
操作的复杂性。使用另一种方法,我在列表和项目之间只有一种多对多关系(项目占主导地位)——这会在列表更新时生成一个项目,并使用
List.find(…).populate('Items')
聚合项目。这几乎是理想的,但我需要在组合中的规定。现在(使用下面的模式),列表和条款之间存在相同的关系——列表更新和“填充”生成并聚合具有正确的
List.id
的条款,但我希望Sails/Waterline生成一个项目模型实例,因为条款包含
Item:{Model:'Item'}
属性。以下是我目前的做法:

规定:

//api/models/Provision.js
module.exports = {
    schema: true,
    attributes: {
        ...
        list: { model: 'list' },
        item: { model: 'item' },
        quantity: { type: 'integer' },
        ...
    }
};
//api/models/List.js
module.exports = {
    schema: true,
    attributes: {
        ...
        items: { collection: 'provision', via: 'list' },
        ...
    }
};
//api/models/Item.js
module.exports = {
    schema: true,
    attributes: {
        ...
        name: { type: 'string', primaryKey: true }
        lists: { collection: 'provision', via: 'item' },
        inStock: { type: 'integer' },
        ...
    }
};
列表:

//api/models/Provision.js
module.exports = {
    schema: true,
    attributes: {
        ...
        list: { model: 'list' },
        item: { model: 'item' },
        quantity: { type: 'integer' },
        ...
    }
};
//api/models/List.js
module.exports = {
    schema: true,
    attributes: {
        ...
        items: { collection: 'provision', via: 'list' },
        ...
    }
};
//api/models/Item.js
module.exports = {
    schema: true,
    attributes: {
        ...
        name: { type: 'string', primaryKey: true }
        lists: { collection: 'provision', via: 'item' },
        inStock: { type: 'integer' },
        ...
    }
};
项目:

//api/models/Provision.js
module.exports = {
    schema: true,
    attributes: {
        ...
        list: { model: 'list' },
        item: { model: 'item' },
        quantity: { type: 'integer' },
        ...
    }
};
//api/models/List.js
module.exports = {
    schema: true,
    attributes: {
        ...
        items: { collection: 'provision', via: 'list' },
        ...
    }
};
//api/models/Item.js
module.exports = {
    schema: true,
    attributes: {
        ...
        name: { type: 'string', primaryKey: true }
        lists: { collection: 'provision', via: 'item' },
        inStock: { type: 'integer' },
        ...
    }
};
我想生成一个供应(如果只是通过更新列表的话),并自动找到或创建一个离散项,在对列表执行
find
时,在供应实例中添加一个项目,因为每个列表的供应都有一个
模型
到项目的链接

我怎样才能做到这一点,或者我是否应该采用更好的设计

  • 当前
    primaryKey
    必须是
    id
    ,请注意
    actionUtil
    中的sails hooks蓝图,该主键必须是
    id
    字段。所以你的
    Item.js
    应该是

    module.exports = {
        schema: true,
        attributes: {
            ...
            // change it's column name if necessary fo your DB scheme
            id: { type: 'string', unique: true, primaryKey: true, columnName: 'name' }
            lists: { collection: 'provision', via: 'item' },
            inStock: { type: 'integer' },
            ...
        }
    };
    
  • 我不太明白你想做什么,怎么做。但是使用
    生命周期回调
    可能会对您有所帮助。例如,在您的声明中,
    我想生成一个条款——如果只是通过更新列表——并自动找到或创建一个离散项
    ,因此使用满足您需要的
    在更新之前
    在创建之前
    ,等等


  • 谢谢,安迪。这并不能完全满足我的需要,但我正在试验一种新的方法。干杯