【发布时间】:2018-10-21 01:26:06
【问题描述】:
我的表结构如下:
- 公司表(hasMany shipping, hasMany Packages)
- orders 表(属于公司,hasMany shipping,hasMany packages)
- shipments 表(belongsTo company、belongsTo order、hasMany packages)
- 包裹表(belongsTo shipping and belongsTo company)
在创建包条目时,我想做类似的事情:
$shipment = $order->shipments()->create($request->all());
$package = $shipment->packages()->create();
如果我在 $shipment 上转储死,它会在其中包含所有正确的 ID,并且我会期望这些关系会允许它创建。但是,由于没有 order_id 的值(订单表中的 id),创建包失败
我是否误解了 eloquent 在这里应该如何工作?
编辑:
订单
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,我想这样做是为了轻松查看属于订单或公司的货件和包裹列表,即货件属于订单和公司。对于货件包裹,这属于一个货件、一个订单和一个公司。
回想起来,也许我试图将每张表与太多东西联系起来。我的理由是“如果我想找出一家公司运送的所有包裹怎么办,因此我应该在包裹表中包含 company_id”。但是,最好只查看公司拥有哪些货物并从那里处理包裹。
【问题讨论】:
-
创建包时,是否提供了company_id?作为包属于公司。
-
为什么不手动创建呢? $package = Package::create([ 'order_id' => $shipment->order_id, ]);
-
packages table (belongsTo shipment and belongsTo company)但有 FK 订单?我有点困惑这里发生了什么。 FK 不是暗示属于订单而不是发货吗?您似乎想要$shipment->order()->packages()->create()或类似的东西。 -
包裹属于快件,快件属于订单。他们各有各的倒也有不少。我希望在创建货件(包含公司和订单)之后,我可以创建包裹,而无需再次重新指定这些 ID。目前,仅使用该关系将货件 ID 拉到包裹中。是否可以在不手动添加它们的情况下提取所有 3 个 id 来创建?