Order
我和Item
模型之间有非常紧密的关系。
Order hasMany Item
Item belongsTo Order
Item hasMany ChildItem
ChildItem is alias for Item (it's a recursive model)
订单模型有一个特殊的Order::prepare()
功能。它在所有附加的行为上触发一个Order.prepare
事件,这些行为控制、验证和修改项目数据,例如运输、项目/订单重量、数量、折扣等。验证和暂存数据以进行保存操作。它还设置Order.total, Order.weight, Order.status, ...
字段。
任何行为也可以根据其限制(库存限制、重量限制、增值税、任何东西)停止准备工作。
何时Item
添加到现有的Order
:
- 从数据库中检索订单及其所有现有项目
- 新的 Item 数据被添加到 Items 数组中
- 订单已准备好(所有行为运行,
Item.subtotal
sOrder.total
,,重量等都被重新计算......) - 如果准备成功,所有新的(和修改的)订单和项目数据都将使用 Order.saveAssociated 保存。
在仔细考虑了多种方法后,我选择了第三种方法,但我卡住了:
beforeSave 回调
此回调将确保这些回调和计算在每个项目上运行,但它使检索相关的订单数据和项目以及运行回调变得更加困难。也很难确定数据是否已经准备好,递归也是一个问题。更难返回准备好的数据而不是保存它。
扩展Model::save
方法
递归也是一个问题,没有保存就无法返回准备好的数据,我通常避免扩展 save()。
解耦准备和保存过程 通过使用自定义模型方法和回调(例如 Order::prepare 和 Order::commit),为订单数据操作创建一个特殊的工作流。行为在非标准事件(beforePrepare、beforeCommit 等)上运行,并且 Model::save() 保持不变。
我很乐意提供更多细节,但它确实是一个庞大的模型,这将是一个很长的问题,我已经尽可能地总结了。任何有关正确方法的想法或示例将不胜感激。