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 中的外键从数据库中提取多行

如何在 Laravel 雄辩关系中添加多个条件

laravel 关联模型 多态关系

一个模型和多个模型之间的 Laravel Eloquent 关系作为 MorphOne?

Laravel - 模型自引用belongsToMany与其他关系和具有多个限制的查询

laravel 雄辩的关系 3 模型