Laravel красноречивая сумма и количество - PullRequest
3 голосов
/ 01 июля 2019

Таблица продуктов:

id        name
1     first product

таблица product_credits:

id   product_id   quantity
1         1          10
2         1          20

Что я пытаюсь сделать:

Я пытаюсь получить все количество продуктов .

Ожидаемые данные:

Получить:

  • наименование товара = первый товар
  • количество продукта = 30

Модель Код отношений:

public function credits () {
    return $this -> hasMany('App\Models\Product\ProductCredits')
        -> whereHas('importInvoice', function ($query) {
            $query->where('deleted_at', null);
        }) -> orderBy('created_at', 'ASC') -> orderBy('quantity', 'DESC');
}

Отношения работают хорошо.

Что я пробовал:

Я пытался использовать функцию with в eloquent.

public function exportProductsCredit(Request $request) {
    // GET THE COLLECTION
    $products = Product::with(['credits' => function ($query) {
        $query -> where('quantity', '>', 1) -> groupBy('product_id') -> sum('quantity');
    }]) -> get();

    return $products;
}

Но выдает ошибку: product_credits.id' isn't in GROUP BY

EDIT

Проблема в том, что у меня есть Mutator поля, которые я хочу показать, например, я вычисляю product_net_price, который я возвращаю как мутатор.

Ответы [ 2 ]

1 голос
/ 01 июля 2019

Если вы хотите использовать его в качестве атрибута, не пытайтесь создать запрос как отношение.

атрибут можно объявить следующим образом: Product::class

public function getSumCreditsAttribute()
{
    return $this->credits->where('quantity', '>', 1)->sum('quantity');
}

вы также всегда можете загрузить его с атрибутом appends

protected $appends = ['sum_credits'];

или получите к нему доступ, если у вас есть экземпляр Product::class

$products = Product::get();
foreach ($products as $product) {
    var_dump($product->sum_credits);
}
0 голосов
/ 01 июля 2019

Так как мы не можем достичь группирования и агрегирования из коробки, используя модель. Вам нужно использовать следующий способ

Product::join('product_credits as pc', 'products.id', '=', 'pc.product_id')
        ->select('products.id', 'products.name', DB::raw("SUM(pc.quantity) as 'product_quantity'"))
        ->with('credits')
        ->where('pc.quantity', '>', 1)
        ->groupBy('pc.product_id')
        ->get();

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...