急切加载单个多对多关系

Eager loading single many-to-many relation

我有两个模型通过枢轴 table 连接,并有一个额外的列来跟踪数量

class Item extends Eloquent {
    public function containers()
    {
        return $this->belongsToMany('Container', 'items_containers', 'item_id', 'container_id')->withPivot(['quantity']);
    }
}

class Container extends Eloquent { 
    public function items() {
        return $this->belongsToMany('Item', 'items_containers', 'container_id', 'item_id')->withPivot(['quantity']);
    }
}

还有我订单的第三个模型:

class OrderItem extends Eloquent {
    public function originalItem()
    {
        return $this->hasOne('Item', 'id', 'item_id');
    }
    public function container() {
        return $this->hasOne('Container', 'id', 'container_id');
    }

}

我想要的是能够在急切加载 OrderItem 模型时从枢轴 table 获取特定数据,所以我只获取 item_id 和 [=14= 的数量] 匹配订单项上的内容。

OrderItems::whereOrderId($orderId)
   ->with(['originalItem', 'container', '???'])
   ->get();

在 OrderItem 上指定关系或使用 with 加载它的最佳方式是什么?

以下returns你想要的:

$orders = \App\OrderItem::select('item_orders.*', 'items_containers.quantity as quantity')->with('item', 'container')
    ->leftJoin('items_containers', function ($join) {
        $join->on('items_containers.item_id', 'item_orders.item_id')
            ->where('items_containers.container_id', \DB::raw('item_orders.container_id'));
    })
    ->get();

那你就可以轻松拿到数量了

$orders->first()->quantity;

就是这样。

大力支持 Morteza Rajabi 让我走上正轨。第一个关键是获取特定关系,因为虽然 Items 和 Container 是多对多关系,但 OrderItem 与 Item 和 Container 具有一对一关系。为了获得特定的关系数量,我必须创建一个指定它的属性:

public function getItemContainerQtyAttribute() {
    if($this->item_id && $this->container_id) {
        return $this->depoItem->containers()->where('items_containers.container_id', $this->container_id)->first()->pivot->quantity;
    }
    return null;
}

item_id 和 container_id 检查是因为这是一项正在进行的工作,OrderItems 并非始终正确创建,并且某些项目没有指定容器。

下一步是使用 Eloquent 中的 appends 属性自动加载它:

protected $appends = ['item_container_qty'];

现在每当我加载 $item = OrderItems::whereOrderId($order_id)->get(); 时,它都会自动加载枢轴数量。