急切加载单个多对多关系
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();
时,它都会自动加载枢轴数量。
我有两个模型通过枢轴 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();
时,它都会自动加载枢轴数量。