Как получить значение AVG по сводным полям - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть проблема, я не понимаю, как рассчитать значение 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;
}

Я ожидаю, что выходной объект содержит список предложений партнеров с AVG, все значения стоимости для каждого AdminProduct

1 Ответ

0 голосов
/ 29 апреля 2019

Вы можете сделать это программно, используя Collections из 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;
      });
  }

Я еще не тестировал код, но он должен работать.Гудлак.

...