多张订单发票合并开数据库怎么设计

问题描述

菜鸟一枚,目前一个订单自动生成一张发票,一个订单表,一个发票表,一对一关系。现在后台要加功能,实现某用户的多张发票可以合并开一张。

问题出现的环境背景及自己尝试过哪些方法

现在想加个发票合并表,发票表加个字段 合并表id,但是后台发票列表查询以发票为主表查询,以前的数据没有合并表id,如何查询把以前的数据都带上?或者还有什么方法

阅读 4.6k
3 个回答

标题文字 ##场景一:用户可以选择多个订单开一张发票

此时在订单表中加入 invoice_id 字段即可、此时用户选择订单(A、B、C)合并开一张发票在发票表中创建数据然后更新用户选择的订单的 invoice_id 字段即可。如下设计即可:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateOrdersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('orders', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('invoice_id');
            //其他字段
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('orders');
    }
}
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateInvoicesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoices', function (Blueprint $table) {
            $table->increments('id');
            //其他字段
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('invoices');
    }
}

场景二:若系统限制一个订单必须对应一张发票、而用户可以选择合并订单开发票。此时在如上逻辑下修改发票表增加 host_id 字段来表示被合并到的发票 id 。这个设计如果 host_id > 0 既被合并的发票,同时兼容多订单开一张发票、多发票合并为一张。

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateInvoicesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('invoices', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('host_id')->default(0);
            //其他字段
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('invoices');
    }
}

以上代码使用 laravel 数据迁移方式书写。

逻辑上控制发票和订单的关系,把发票和订单关系改成一对多就可以了。加一个发票订单关联表实现一对多关系。发票在点击生成的时候才创建,根据用户选择的订单id创建合并的发票,而不是跟订单一起创建。

订单表
发票表
发票订单关联表(存储哪些订单开了发票。开到了哪张发票上)

发票表
发表ID,发票号,开票金额...等等
发票关联表
订单ID,发票ID,开票时间,状态(成功/失败)

开票的时候传入需要开票的订单ID即可。
先检查是否被开过票,没有的话,批量写入发票关联表即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题