昨天我們了解到最簡單的流程以及結構,
今天我們稍微將現有的結構做一點變化,
為什麼要做變化呢?
主要是因為訂單通常牽扯到金錢以及貨品,
以昨天的內容來說,金錢相關最基礎就要增加三個欄位,這還沒有一些延伸應用,
如果在加上貨品相關的欄位的話,這樣table order會過於肥大,
因此通常會將金流和物流的資料在獨立出來,
我們看一下變化
Schema::create('order', function (Blueprint $table) {
$table->string('id', 30)->comment('訂單id');
$table->string('name', 30)->comment('購買人姓名');
$table->integer('amount')->default(0)->comment('總金額');
$table->string('status', 20)->default('pending')->comment('訂單狀態');
$table->primary(['id']);
});
Schema::create('payment', function (Blueprint $table) {
$table->string('id', 30)->comment('同訂單id');
$table->string('payment_id', 30)->comment('金流單id');
$table->string('type', 20)->comment('付款類型'); //credit, atm
$table->string('status', 30)->default('unpaid')->comment('付款狀態');
$table->dateTime('expired_at')->nullable()->comment('付款截止時間');
$table->dateTime('paid_at')->nullable()->comment('付款時間');
$table->text('info')->nullable(); // 付款資訊物件(ATM帳號/超商代碼/超商條碼)
$table->float('amount')->default(0); // 金額
$table->float('fee')->default(0); // 手續費
$table->primary(['id']);
});
另外物流的部份也是一樣多開table,
這邊就不特別說明了,不再我們這次要講的主題裡面。
//todo
Schema::create('freight', function (Blueprint $table) {
$table->string('id', 30)->comment('同訂單id');
$table->primary(['id']);
});
回到結構可以看到有部份欄位從order移除,改成透過table payment紀錄資料,
並且重新定義order status,
從unpaid、paid、failed三種對應未附款、已付款、付款失敗,
改成processing、finished、refund、cancel、error,
並且將原先的付款狀態改成由payment.status紀錄。
table payment則紀錄一些選擇項目,以及付款資訊等等,
這邊可以看到多開一個fee的欄位是因為,有可能會將金流的服務費用轉嫁給消費者,
所以有獨立fee欄位可以使用,
把項目order_item、金流payment、物流freight獨立之後,table order變得乾淨許多,
也可以因應各種情況,但是這邊還是老話一句,目前文章提供的範例都相對陽春,
在實際應用上可能還會有很多遺漏,因此結構是死的人是活的,
整個架構結構都可以調整或擴充。