我正在构建一个应用程序,该程序可以从包括Shopify在内的各种电子商务平台导入数据。当管理员更新订单时,该数据可能会更改。该应用程序必须始终具有最新记录以及审核历史记录,以查看更改的内容和时间。我正在使用Laravel Auditing package记录更改。
理想情况下,我的代码仅应负责:
然后,我想善于处理以下方面的繁重工作:
例如,如果订单本身没有变化,但是地址发生了变化,那么当我致电$order->save()
时,它应该更新地址并保存审核历史记录。
一个选项可能是在用数据填充模型之前,先检查数据库中是否存在Address
或OrderItem
。这是不理想的,因为:
Address
模型的类将需要知道地址用于的Order
模型。这也违反了SRP。createNewOrder()
和updateExistingOrder()
使用单独的函数,以避免代码重复。当应用程序第一次看到订单时,它将填充模型,然后INSERTs记录这些实体,如下所示:
$order = SalesOrder::firstOrNew([
'store_id' => $orderData['store_id'],
'external_id' => $orderData['external_id']
]);
$order->save();
$order->salesOrderAddresses()->save($billingAddress);
if(@$shippingAddress) {
$order->salesOrderAddresses()->save($shippingAddress);
}
$order->salesOrderItems()->saveMany($items);
我有为订单本身工作的审核历史记录。那部分效果很好,但是如果我可以先建立整个订单模型,然后调用一个save()
,这使Eloquent聪明地将所有更改保存到数据库中,就很好了。
在SalesOrder
类中,我有以下关系:
public function salesOrderAddresses() {
return $this->hasMany(SalesOrderAddress::class,'order_id');
}
public function salesOrderItems() {
return $this->hasMany(SalesOrderItem::class,'order_id');
}
层次结构如下:
SalesOrder = [
Addresses [
Address (billing),
Address (shipping)
],
Items = [
[
sku: abc,
qty: 123
],
[
sku: xyz,
qty: 321
]
]
]
无论如何,我可能完全以错误的方式来处理这个问题。希望那里有一些经验丰富的Eloquent / Laravel开发人员可以建议一种更好的处理方式。