我无法弄清楚如何急切加载关系列的总和。
数据库(简化)如下;
TABLES
PRODUCT PRODUCT_VARIATIONS
*ID* *ID*
*NAME* *NAME*
*AVAILABLE_STOCK*
我的关系设置如下;
public function variations()
{
return $this->hasMany('Product_variation');
}
加载所有产品时,我希望能够看到附加到产品对象本身的该产品的所有库存的总和。
产品可能有很多变化。
我可以返回产品附带的所有个人变体(见下文)
$products = Product::with('variations')->paginate(15);
但我只是想用一个简单的整数返回所有产品,显示其available_stock计数,并考虑所有变化。
我希望能够输入
@foreach ($products as $product)
$product->available_stock // Returns INT
@endforeach
答案 0 :(得分:3)
答案 1 :(得分:3)
问题是,您不希望count
,而是sum
。所以这就是你需要的东西,就像@Joseph链接的文章一样,只有不同的聚合函数:
public function availableStock()
{
return $this->hasOne('Product_variation')
->selectRaw('product_id, sum(available_stock) as aggregate')
->groupBy('product_id');
}
public function getaAvilableStockAttribute()
{
if ( ! array_key_exists('availableStock', $this->relations)) {
$this->load('availableStock');
}
$relation = $this->getRelation('availableStock');
return ($relation) ? $relation->aggregate : null;
}
然后你可以做你要求的事情:
$products = Product::with('availableStock')->get();
$products->first()->availableStock; // '155' | null
// or simply
Product::first()->availableStock; // '155' | null
答案 2 :(得分:0)
好的,谢谢你的答案@joseph,现在我知道我正在疯狂追逐。
用一个没有吸引力的foreach解决问题
$products = Product::with('variations')->remember(2)->paginate(15);
foreach ($products as $product) {
$i = 0;
foreach ($product->variations as $variation)
{
$i = $i + $variation->available_stock;
}
unset($product->variations);
$product->available_stock = $i;
}