首页 > 解决方案 > 通过使用 Eloquent 关系查找两个连接之外的 ID 来获取结果

问题描述

我需要使用两个连接之外的 id 从一个表中获取行。我知道我可以使用join('table_name'),但我正在尝试使用模型名称而不是原始表名称。

我试图shipping_shipment.*通过加入order_item_join_shipping_shipment然后加入order_item和过滤来选择where order_item.order_id = x

我在 ShippingShipment 类中尝试过这个,但我无法弄清楚。

return $this->hasManyThrough(OrderItem::class, ShippingShipment::class, 'shipment_id', 'order_item_id', 'id', 'id');

一个订单中有很多商品,并且有很多发货。我需要收货。
每个订单可以有不止一件货物 - 物品来自不同的地方。
每件物品可以有不止一个货件 - 如果有东西被退回并需要再次运输。

我要从中获取行的表 shipping_shipment 通过连接表 order_item_join_shipping_shipment 连接到 order_item。该连接表具有 order_item_id。然后我需要加入 order_item 表,以便我可以搜索 order_item.order_id

order_item模型 OrderItem

+-----+---------------+
| id  | order_id      |
+-----+---------------+
|  6  |     13464     |
|  8  |     13464     |
|  9  |     13464     |
+-----+---------------+

order_item_join_shipping_shipment模型 OrderItemJoinShippingShipment

+-----+---------------+-------------+
| id  | order_item_id | shipment_id |
+-----+---------------+-------------+
|  1  |       6       |     12      |
|  1  |       9       |     12      | two items in one shipment
|     |               |             |
|  2  |       8       |     13      |
|  3  |       8       |     14      | one item was returned so shipped again
+-----+---------------+-------------+

shipping_shipment不需要描述,只是说它有一个 id 列。

如果我用 MySQL 来做,它看起来像这样

SELECT ss.*, oiss.order_item_id FROM 
    order_item_join_shipping_shipment AS oiss
    INNER JOIN shipping_shipment AS ss ON (oiss.shipment_id = ss.id)
    INNER JOIN order_item AS oi ON (oiss.order_item_id = oi.id)
WHERE oi.order_id = 13464

标签: phplaraveleloquent

解决方案


据我所知,您正在使用 ShippingShipment 和 OrderItem 之间的数据透视表。如果我对您的理解正确,您希望获取连接到 ShippingShipment 的 OrderItems,如果是这种情况,您可以执行以下操作:

Make 在这两种模型中都属于许多关系,例如:

ShippingShipment:

public function orderItems(){
  return $this->belongsToMany(OrderItem::class, 'table_name', 'column_id');
}

订单项:

public function shippingShipment(){
  return $this->belongsToMany(ShippingShipment::class, 'table_name', 'column_id');
}

然后您可以通过键入以下查询来获得所需的结果:

 ShippingShipment::find(1)->with('orderItems')->get();

OrderItem::find(13464)->with('shippingShipments')->get();

注意:您可以使用orderItems:id,ordershippingShipment:id,some_other_field进行更优化的查询


推荐阅读