Laravel красноречивое количество отношений суммы и groupby

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

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 в красноречивом.

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

РЕДАКТИРОВАТЬ

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
4
0
2 388
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

вы можете объявить такой атрибут в 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);
}

Это хорошее решение, но всякий раз, когда я вызываю модель Product, она возвращает с ней sum_credits, верно? Я не хочу, чтобы это было так

AE1995 01.07.2019 13:31

@ Дэнни, если вы не поместите sum_credits в атрибут $append, он не будет загружен, пока вы не попытаетесь получить к нему доступ через ->sum_credits. вы можете проверить это с помощью dd('product').

N69S 02.07.2019 12:16

Это хорошее решение, и оно поможет мне во всех предстоящих отчетах. Спасибо

AE1995 02.07.2019 12:23

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

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

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

Выдает ошибку quantity.id column not found Я изменил на quantity но все равно не работает

AE1995 01.07.2019 13:32

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

AE1995 01.07.2019 13:50

Также ваше решение не возвращает поля мутатора, которые я хочу показать.

AE1995 01.07.2019 13:50

Насколько я тестировал в локалке. Я могу получить доступ к этим мутаторам как в контроллере, так и в поле зрения.

Naranz 01.07.2019 14:20

Другие вопросы по теме