【发布时间】:2019-04-13 10:25:06
【问题描述】:
我在让 hasManyThrough 工作时遇到问题:
public function deliveryContainers() : HasManyThrough
{
return $this->hasManyThrough(
DeliveryContainer::class, // Final
StockMovement::class, // Intermediate
'product_id', // Foreign key on Intermediate
'id', // Foreign key on Final
'product_id', // Local key on Current
'location_id' // Local key on Intermediate
)->where('delivery_id', $this->delivery_id);
}
由于 stockMovements 表返回多个结果,我生成的交付容器集合包含重复条目。如果我能以某种方式在中间表查询上放置一个组/唯一组,那么这将得到解决。
我可以使用以下方法获得一个包含正确的 deliveryContainers 的集合:
public function deliveryContainers()
{
return $this->hasMany(StockMovement::class, 'entity_id', 'delivery_id')
->with('deliveryContainer')
->where('product_id', $this->product_id)
->get()
->unique('location_id');
}
但是,要访问 deliveryContainer,我现在有以下内容:
foreach($this->deliveryContainers() as $row){
$row->deliveryContainer->id;
}
还有我想要的……
foreach($this->deliveryContainers() as $row){
$row->id;
}
有没有什么方法可以将急切加载的关系提升一个级别(如果可以用来描述它的话),或者甚至更好地为 hasManyThrough 关系添加某种独特的过滤器?
表结构
delivery_exceptions(这种关系的来源)
- product_id
- delivery_id
delivery_containers
- 身份证
- delivery_id
stock_movements
- entity_id(链接到交付 ID)
- product_id
关系
- 交付异常属于产品
- 一个产品有很多库存变动
- 库存移动属于交货容器
- 交货例外有许多交货容器...(间接地,通过产品和库存变动的组合)
【问题讨论】:
-
您的模型到底长什么样,它们的键和其他关系定义是什么?
-
这些真的是
delivery_containers表上的所有键和外键吗?因为如果是这样,你为什么需要hasManyThrough关系呢?在delivery_exceptions上,您有一个delivery_id,您可以在delivery_containers上再次找到它。所以它对我来说看起来很直接...... -
交付容器实际上需要与库存移动表的关系才能将交付拆分为交付容器。一个交货有许多交货容器,一个交货容器有许多产品。我正在尝试查找包含交付产品的所有交付容器
标签: php laravel eloquent has-many-through