【问题标题】:How to get AVG value by pivot fields如何通过数据透视字段获取 AVERAGE 值
【发布时间】:2019-04-29 07:39:20
【问题描述】:

我有一些问题,我不明白从模型中获取所有值时如何计算 AVG 值。 我有2个模型。首先是AdminProduct - 保存有关产品的基本信息。 第二个模型是 - PartnerOffer - 持有合作伙伴为 AdminProduct 提供的优惠。 我有数据透视表partner_offer_admin_product - 为表和字段price 保存2个外键。

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);
}

迁移伙伴_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 列表合作伙伴优惠

【问题讨论】:

    标签: laravel laravel-5 eloquent eloquent-relationship


    【解决方案1】:

    您可以以编程方式利用 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;
          });
      }
    

    我还没有测试代码,但它应该可以工作。祝你好运。

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多