Laravel 关系 - 从多个模型中提取 ID
Posted
技术标签:
【中文标题】Laravel 关系 - 从多个模型中提取 ID【英文标题】:Laravel relationships - pulling in ID's from multiple models 【发布时间】: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 来创建?
【参考方案1】:
这看起来你的关系是错误的,order_id 应该在 shipping 表中,因此它与订单上的 id 相关。
【讨论】:
我在出货表中有一个 order_id 列,出货属于订单。 请发布您的代码,货件需要一个 order_id 才能使用。 你还没有设置你的关键引用 $table->foreign('order_id')->references('id')->on('orders');您传递了数据,但 Eloquent 不知道 ID 的值 谢谢@Pedro。实际上,order_id 与上面的代码配合得很好。我必须手动添加的是 company_id。我认为命名约定消除了像这样设置外键的需要。即公司上的 id 是相关表上 company_id 的关键。以上是关于Laravel 关系 - 从多个模型中提取 ID的主要内容,如果未能解决你的问题,请参考以下文章
一个模型和多个模型之间的 Laravel Eloquent 关系作为 MorphOne?