Выберите последний ряд группы на Laravel Eloquent - PullRequest
0 голосов
/ 10 мая 2018

У меня есть три таблицы:

магазины
| - id
| - имя

Продукты
| - id
| - имя

цены
| - id
| - значение
| - product_id
| - store_id
| - созданный_

Как видите, у нас есть один и тот же товар в нескольких магазинах, каждый из которых имеет свою цену (новая запись создается при обновлении цены для сохранения истории).

Мои вопросы:
А) Я хочу отобразить таблицу текущих цен во всех магазинах определенного товара;
Б) Я хочу отобразить список всех товаров и ваши самые дешевые цены с названием магазина с этой ценой.

Как это возможно в Eloquent of Laravel 5.6?

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Использование Eloquent - простой способ получения реляционных данных.

1) Цена (принадлежит продукту и магазину)

2) Товар (имеет много цен)

3) Магазин (имеет много цен)

1) Price.php

<?php

namespace App\Models;
use Eloquent;

class Price extends Eloquent{

    protected $table = 'prices';

    public function store()
    {
        return $this->belongsTo('App\Models\Store');
    }

    public function product()
    {
        return $this->belongsTo('App\Models\Product');
    }

}

2) Product.php

<?php

namespace App\Models;

use Eloquent;

class Product extends Eloquent
{
    protected $table = "products";

    public function prices()
    {
        return $this->hasMany('App\Models\Price');
    }

}

3) Store.php

<?php

namespace App\Models;

use Eloquent;

class Store extends Eloquent
{
    protected $table = "stores";

    public function prices()
    {
        return $this->hasMany('App\Models\Store');
    }

}

После объявления модели вам нужно получить такие записи

$price = \App\Models\Price::with(['store','product'])->groupby(['store.name','product.name'])->get();
$price->store->name;

Я надеюсь, что вы должны помочь этому.

0 голосов
/ 10 мая 2018

Используйте это отношение:

class Product extends Model
{
    public function stores()
    {
        return $this->belongsToMany(Store::class, 'prices')->withPivot('value');
    }
}

A)

foreach($product->stores as $store) {
    $price = $store->pivot->value;
}

В)

$products = Product::with('stores')->get();
foreach($products as $product) {
    $cheapestStore = $product->stores->sortBy('pivot.value')->first();
    $price = $cheapestStore->pivot->value;        
}
0 голосов
/ 10 мая 2018

Это поможет вам написать ваш запрос:

  A.   select st.name,pd.name, pr.value from prices pr
       left join products pd on pd.id = pr.product_id
       left join stores st on st.id = pr.store_id

  B.   select st.name,pd.name, min(pr.value) as price from prices pr
       left join products pd on pd.id = pr.product_id
       left join stores st on st.id = pr.store_id group by st.name,pd.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...