如何创建或更新具有自动保存的审核历史记录的复杂口才模型

时间:2018-09-27 20:36:20

标签: php laravel eloquent lumen

我正在构建一个应用程序,该程序可以从包括Shopify在内的各种电子商务平台导入数据。当管理员更新订单时,该数据可能会更改。该应用程序必须始终具有最新记录以及审核历史记录,以查看更改的内容和时间。我正在使用Laravel Auditing package记录更改。

理想情况下,我的代码仅应负责

  1. 使用数据(顺序,地址,项目)填充 PHP模型对象
  2. 相互关联模型(向订单添加商品/地址)

然后,我想善于处理以下方面的繁重工作

  1. 检查其中任何一个模型的现有记录
  2. 插入(如果不是),或更新(如果是)
  3. 保存更改的审核历史记录

例如,如果订单本身没有变化,但是地址发生了变化,那么当我致电$order->save()时,它应该更新地址并保存审核历史记录。

一个选项可能是在用数据填充模型之前,先检查数据库中是否存在AddressOrderItem。这是不理想的,因为:

  1. 填充模型的类仅应负责用数据填充模型:它不关心记录是否已存在,因为这会破坏the Single Responsibility Principle
  2. 填充Address模型的类将需要知道地址用于的Order模型。这也违反了SRP。
  3. 我还希望避免为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开发人员可以建议一种更好的处理方式。

0 个答案:

没有答案