NodeJS|SailsJS|Waterline:一对多--对--多对多关系中的自动模型生成
NodeJS|SailsJS|Waterline: Automatic Model Generation in One-To-Many--To--Many-To-Many Relationships
下面需要什么类型的关系,我如何利用 SailsjS/Waterline 来简化我的查找和更新查询?
在我的应用程序中,我有列表 (List-Model)、项目 (Item-Model) 和供应 (Provision-Model)。该应用程序的目的是管理 库存。因此,项目是离散的——这意味着,在项目集合中只能有一个相同的项目(primaryKey
在 item.name
上设置)。单个列表与项目共享一对多关系 -- vicariously through Provisions。 Provision 只是给定列表的 [离散] 项目的详细信息。在这种情况下,a Provision 只能使用 List-Id 和 Item-Id (list.id + item.id === provision.compositePrimaryKey
).
访问
我的问题是处理 find
和 update
操作的复杂性。通过另一种方法,我在列表和项目之间只有一个多对多关系(项目占主导地位)——这会在列表更新时生成一个项目,并使用 List.find(...).populate('items')
聚合项目。这几乎是理想的,但我需要在组合中提供规定。现在(使用下面的模式),列表和条款之间存在相同的关系——列表更新和 'populates' 生成并聚合具有正确 list.id
的条款,但我期望 Sails/Waterline生成一个 Item-Model-Instance 因为 Provision 包含一个 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' },
...
}
};
我想生成一个条款——如果只是通过更新列表——并自动找到或创建一个离散项目——并在条款中添加一个项目-在列表上执行 find
时的实例,因为每个列表的 Provision 都会有一个 model
link 到 Item.
我该怎么做,或者我应该采用更好的设计吗?
目前 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' },
...
}
};
我不太明白你想接近什么以及如何接近。但是使用 Lifescycle callbacks
可能会对您有所帮助。例如在你的语句I would like to generate a Provision -- if only through updating a list -- and have a discrete Item found or created automatically
中,所以使用beforeUpdate
、beforeCreate
等满足你需要的。
下面需要什么类型的关系,我如何利用 SailsjS/Waterline 来简化我的查找和更新查询?
在我的应用程序中,我有列表 (List-Model)、项目 (Item-Model) 和供应 (Provision-Model)。该应用程序的目的是管理 库存。因此,项目是离散的——这意味着,在项目集合中只能有一个相同的项目(primaryKey
在 item.name
上设置)。单个列表与项目共享一对多关系 -- vicariously through Provisions。 Provision 只是给定列表的 [离散] 项目的详细信息。在这种情况下,a Provision 只能使用 List-Id 和 Item-Id (list.id + item.id === provision.compositePrimaryKey
).
我的问题是处理 find
和 update
操作的复杂性。通过另一种方法,我在列表和项目之间只有一个多对多关系(项目占主导地位)——这会在列表更新时生成一个项目,并使用 List.find(...).populate('items')
聚合项目。这几乎是理想的,但我需要在组合中提供规定。现在(使用下面的模式),列表和条款之间存在相同的关系——列表更新和 'populates' 生成并聚合具有正确 list.id
的条款,但我期望 Sails/Waterline生成一个 Item-Model-Instance 因为 Provision 包含一个 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' },
...
}
};
我想生成一个条款——如果只是通过更新列表——并自动找到或创建一个离散项目——并在条款中添加一个项目-在列表上执行 find
时的实例,因为每个列表的 Provision 都会有一个 model
link 到 Item.
我该怎么做,或者我应该采用更好的设计吗?
目前
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' }, ... } };
我不太明白你想接近什么以及如何接近。但是使用
Lifescycle callbacks
可能会对您有所帮助。例如在你的语句I would like to generate a Provision -- if only through updating a list -- and have a discrete Item found or created automatically
中,所以使用beforeUpdate
、beforeCreate
等满足你需要的。