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' },
...
}
};
生命周期回调
可能会对您有所帮助。例如,在您的声明中,我想生成一个条款——如果只是通过更新列表——并自动找到或创建一个离散项
,因此使用满足您需要的在更新之前
,在创建之前
,等等谢谢,安迪。这并不能完全满足我的需要,但我正在试验一种新的方法。干杯