laravel - 如何通过数据透视字段获取 AVG 值
问题描述
我有一些问题,我不明白从模型中获取所有值时如何计算 AVG 值。我有2个模型。首先是AdminProduct
- 保存有关产品的基本信息。第二种模式是PartnerOffer
——持有合作伙伴为 AdminProduct 提供的优惠。而且我有数据透视表partner_offer_admin_product
- 为表和字段保存 2 个外键price
。
AdminProduct.php
public function partnerOffers()
{
return $this->belongsToMany(PartnerOffer::class, 'partner_offer_admin_product')->withPivot('price);
}
PartnerOffer.php
public function adminProducts()
{
return $this->belongsToMany(AdminProduct::class, 'partner_offer_admin_product')->withPivot('price);
}
迁移 partner_offer_admin_product.php
Schema::create('partner_offer_admin_product', function (Blueprint $table) {
$table->unsignedBigInteger('admin_product_id');
$table->unsignedBigInteger('partner_offer_id');
$table->unsignedDecimal('price', 10, 2);
$table->foreign('admin_product_id')->references('id')->on('admin_products')->onDelete('cascade');
$table->foreign('partner_offer_id')->references('id')->on('partner_offers')->onDelete('cascade');
});
AdminProductRepository.php
public function getAll()
{
$products = AdminProduct::all();
// How to count avg value via pivot table field `price`
}
// How count Avg by id AdminProduct best. Below my solution.
public function getOffers($id)
{
$avg = DB::select('select avg(`price`) as value from `partner_offer_admin_product` where `admin_product_id` =' . $id);
// dd ($avg);
$collection = collect([
'item' => [
'product' => AdminProduct::with('partnerOffers')->find($id),
'avg_price' => $avg,
],
]);
return $collection;
}
我希望输出对象包含每个 AdminProduct 的 AVG all value price 列表合作伙伴优惠
解决方案
您可以以编程方式利用 eloquent 中的集合(不使用单独的查询),如下所示:
public function getAll()
{
$products = AdminProduct::with('partnerOffers')->get();
// Below adds a custom field to each row with averaged value of field `price` from the pivot table
return $products->map(function ($product) {
$product['avg_price'] = $product->partnerOffers->avg('price');
return $item;
});
}
我还没有测试代码,但它应该可以工作。祝你好运。
推荐阅读
- python - Python 新手 - 打印功能问题
- javascript - 该网站如何在没有任何权限的情况下控制用户在选项卡之间的导航?
- swift3 - 数据已通过 tableview 中的 didselect 传递到下一个视图控制器。弹出到上一个视图控制器时出错[索引超出范围]
- ruby - Ruby 无法加载“sqlite3”
- python-3.x - 如何通过从“ndiff”附加类似的行来获得编辑结果?
- javascript - 如何等到模态关闭并根据单击确定或取消继续执行?
- c# - 如何使用自定义类作为实体的属性并通过 Entity Framework Core 进行转换?
- javascript - JAVASCRIPT - 将值附加到一组选择选项中的一个选择选项
- node.js - 致命错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足
- tensorflow - 在 seq2seq 模型实施中需要建议