Laravel关系 - 从多个模型中提取ID

时间:2018-05-10 17:42:40

标签: php laravel eloquent

我的表结构如下:

  1. 公司表(hasMany货运,hasMany包)
  2. 订单表(belongsTo公司,hasMany货运,hasMany包)
  3. 货运表(belongsTo公司,belongsTo订单,hasMany包)
  4. 包表(belongsTo shipping and belongsTo company)
  5. 创建包条目时,我想做类似的事情:

    $shipment = $order->shipments()->create($request->all());
    $package = $shipment->packages()->create();
    

    如果我在$货件上转储,它上面有所有正确的ID,我原本希望这种关系可以创建。但是,如果没有order_id(订单表中的id)

    的值,则创建包失败

    我是否误解了雄辩应该如何在这里工作?

    编辑:

    订单

    Schema::create('orders', function (Blueprint $table) {
        $table->uuid('id');
        $table->uuid('company_id');
        $table->uuid('order_address_id');
        $table->integer('user_id');
        $table->string('unique_id');
        $table->string('order_ref')->default('');
        $table->string('status');
        $table->boolean('hold_or_cancel')->default(0);
        $table->string('shipping_method');
        $table->dateTime('completed_at')->nullable();
        $table->timestamps();
        $table->unique(array('company_id', 'unique_id'));
    

    装运

    Schema::create('shipments', function (Blueprint $table) {
        $table->uuid('id');
        $table->uuid('order_id');
        $table->uuid('company_id');
        $table->string('status')->default('new');
        $table->string('shipment_type');
        $table->string('shipping_method')->default('');
        $table->string('reference')->default('');
        $table->timestamps();
    });
    

    Schema::create('shipment_packages', function (Blueprint $table) {
        $table->uuid('id');
        $table->uuid('order_id');
        $table->uuid('company_id');
        $table->uuid('shipment_id');
        $table->string('tracking_number')->default('');
        $table->integer('package_weight_g')->nullable();
        $table->integer('package_length_cm')->nullable();
        $table->integer('package_width_cm')->nullable();
        $table->integer('package_height_cm')->nullable();
        $table->timestamps();
    });
    

    要创建订单,我使用以下工作正常。

    $address = OrderAddress::create($data);
    $order = $address->order()->create($data);
    

    要创建我尝试使用的货件和包裹:

    DB::transaction(function () use ($order, $request) {
        $shipment = $order->shipments()->create($request->all());
        $package = $shipment->shipmentPackages()->create();
    });
    

    但是我无法使用这种方法来通过公司或订单ID,我想这样做是为了轻松查看属于订单或公司的货件和包裹清单,即货物属于订单和公司。对于装运包,这属于装运,订单和公司。

    经过反思,也许我试图将每张桌子与太多东西联系起来。我的理由是"如果我想找出公司发货的所有包装,那么我应该在package表中包含company_id"。但是,也许最好只看一下公司拥有哪些货物并从那里开始运送包裹。

1 个答案:

答案 0 :(得分:0)

看起来你的关系错了,order_id应该在货运表中,所以它与订单上的id有关。