續期建立訂單時,只讀訂閱自己,不回頭讀 products。
訂閱最容易被忽略的一件事:它會活很久。
客戶今年三月訂的,可能扣到明年。這段期間,商品會發生什麼事?
如果你的續期流程是「讀 product_id → 撈商品 → 建立訂單」,上面每一件事都是一顆地雷。商品漲價,所有訂閱戶下個月自動被多扣錢,而他們從來沒同意過。商品被刪掉,排程直接噴錯。
subscriptions 表上存的是快照:
product_sku 商品 SKU
product_name 商品名稱
image_path 商品圖片
unit_price 一般售價
subscription_unit_price 訂閱售價
quantity 數量
cycle_days 週期天數
收件人、配送方式、運費、付款方式、發票設定,也全部快照在同一張表上。
然後續期時,createDraftOrder() 只讀這張表:
$order->items()->create([
'sku' => $this->product_sku,
'name' => $this->product_name,
'image_path' => $this->image_path,
'unit_price' => $this->unit_price,
'quantity' => $this->quantity,
// ...
]);
沒有 Product::find()。一行都沒有。
商品後續怎麼改,都不影響已經成立的訂閱。 這不只是技術上的穩定,更是商業上的正確——客戶同意的是他當初看到的那個價格。